Какое сопоставление выбрать для веб-сайта на разных языках?

25

Влияет ли сопоставление на скорость запроса? Меняется ли размер таблицы в зависимости от сопоставления?

Если я хочу создать веб-сайт, который должен поддерживать все возможные языки (например, для Google), какой будет рекомендуемая сортировка?

Мне нужно будет хранить такие символы, как 日本語, мои поиски на сайте должны будут возвращаться somethingдля sóméthíngввода, он также должен быть без учета регистра.

Как я узнаю, какой выбор лучше сделать? Какое сопоставление лучше подходит для этого случая?

BrunoLM
источник
4
Возможно, вы захотите перефразировать вопрос, чтобы он не звучал так субъективно - по какому принципу «лучшее» сопоставление? :)
TML
Новый заголовок читается намного лучше
TML

Ответы:

16

Вообще говоря, один из вариантов Unicode, вероятно, лучше всего подходит для широкой языковой поддержки - UTF-8 будет использовать меньше памяти на кодовую точку и, таким образом, будет иметь небольшое преимущество в любых компромиссах времени / пространства, которые вам понадобятся; тем не менее, я думаю, что есть некоторые из более эзотерических языков / сценариев, которые не может представлять UTF-8 (но я не уверен на 100%, я не провел исчерпывающего исследования по этому вопросу).

Эта статья в Википедии может показывать преимущества и недостатки каждого из них.

TML
источник
Да, UTF-8 может обрабатывать 1,1 миллиона кодовых точек Unicode.
vz0
Спасибо - я думал, что есть некоторые символы Хана или тому подобное, которые не поддерживаются в UTF-8, хорошо, чтобы получить твердый ответ.
TML
8

Я думаю, что поставленный вопрос (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. Как всегда, обратитесь к документации для вашей конкретной системы баз данных.

Йонас Кёлкер
источник