Я думаю, что поставленный вопрос (2015-04-20, «Какое сопоставление [...]») не является тем, что подразумевается, учитывая, что принятый ответ говорит о кодировании, а не о сопоставлении. Позвольте мне ответить на заданный вопрос, а не на предполагаемый, просто потому, что я думаю, что это интересно :-)
Википедия говорит: «Сортировка - это сбор письменной информации в стандартный порядок». В вычислительной технике сопоставление приобрело значение «спецификация такого порядка». Другими словами, сопоставление - это (или подразумевается) определение трехсторонней функции сравнения.
Я думаю, что короткий ответ "определенно возможно". По крайней мере, я знаю о следующих махинациях:
#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12 # \xf6 is one character
assert len(enc) == 13 # but two bytes in utf-8
import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38
locale.strxfrm
является функцией Returns a string that behaves for cmp locale-aware
, то есть она кодирует строку таким образом, что побайтное байтовое стандартное лексикографическое сравнение с другой строкой, закодированной аналогично, даст тот же результат, что и сравнение строк в соответствии с функцией сортировки, указанной в локали.
Некоторые наблюдения: в da_DK.utf8
, строка ouüö
отсортирована. В de_DE.utf8
, строка oöuü
сортируется. Обратите внимание, что len(long_form) == 38
и 38> 13. (Длина также 38 дюймов de_DE.utf8
.)
Если в вашей базе данных есть индекс для какого-либо строкового поля, сопоставленного в соответствии с этим da_DK.utf8
, она может внутренне делать что-то подобное strxfrm
для простого сравнения. (С другой стороны, диски работают медленно. Индексирование может быть быстрее на основе более компактного представления, если более высокая стоимость сравнения для каждого символа более чем компенсируется сравнением меньшего количества символов.)
Вы спрашиваете: «Имеет ли сопоставление какое-либо влияние на скорость запроса?», На что я почти уверен, что ответ «да»: сопоставление «C» (он же «POSIX») просто сравнивает значения кодовой точки Unicode, тогда как датский ( da_DK.utf8
) и немецкие ( de_DE.utf8
) локали делают что-то более хитрое. Это будет иметь некоторое влияние на скорость запросов, хотя я подозреваю, что об этом не стоит беспокоиться.
"Меняется ли размер таблицы в зависимости от сопоставления?" - Я могу представить себе индекс в соответствии с одним сопоставлением и другой индекс в соответствии с другим сопоставлением, или только один из двух таких индексов с примененным неким strxfrm
подобным преобразованием. В этом гипотетическом сценарии, если есть два сопоставления с различными характеристиками размера, ответ - да.
"Какой будет рекомендуемая сортировка?" - Это зависит от того, зачем вам нужно сортировать строки. Если бы это был только какой-то канонический способ упорядочения строк, я бы, вероятно, пошел с "C". Если это для представления данных пользователям в отсортированном порядке в соответствии с ожиданиями человека, и эти ожидания определяются их культурой, и вы хотите, чтобы база данных (а не какой-то другой уровень) выполняла сортировку, возможно, вам следует создать один индекс для сопоставления т. е. хотя бы один по da_DK.utf8
датчанам и один по de_DE.utf8
немцам. Я думаю, что это может стать довольно большим довольно быстро, хотя.
Все это в значительной степени зависит от внутренней работы вашей базы данных; Я думаю, что это выходит далеко за рамки "стандартизированного" (смеется!) SQL. Как всегда, обратитесь к документации для вашей конкретной системы баз данных.