Влияет ли сопоставление на скорость запроса? Меняется ли размер таблицы в зависимости от сопоставления?
Если я хочу создать веб-сайт, который должен поддерживать все возможные языки (например, для Google), какой будет рекомендуемая сортировка?
Мне нужно будет хранить такие символы, как 日本語
, мои поиски на сайте должны будут возвращаться something
для sóméthíng
ввода, он также должен быть без учета регистра.
Как я узнаю, какой выбор лучше сделать? Какое сопоставление лучше подходит для этого случая?
performance
sql-server
collation
BrunoLM
источник
источник
Ответы:
Вообще говоря, один из вариантов Unicode, вероятно, лучше всего подходит для широкой языковой поддержки - UTF-8 будет использовать меньше памяти на кодовую точку и, таким образом, будет иметь небольшое преимущество в любых компромиссах времени / пространства, которые вам понадобятся; тем не менее, я думаю, что есть некоторые из более эзотерических языков / сценариев, которые не может представлять UTF-8 (но я не уверен на 100%, я не провел исчерпывающего исследования по этому вопросу).
Эта статья в Википедии может показывать преимущества и недостатки каждого из них.
источник
Я считаю, что вы должны использовать сопоставление Unicode с акцентом и без учета регистра. Прочтите статьи MSDN « Выбор параметров сортировки и использование параметров сортировки SQL» и все связанные статьи.
источник
Я думаю, что поставленный вопрос (2015-04-20, «Какое сопоставление [...]») не является тем, что подразумевается, учитывая, что принятый ответ говорит о кодировании, а не о сопоставлении. Позвольте мне ответить на заданный вопрос, а не на предполагаемый, просто потому, что я думаю, что это интересно :-)
Википедия говорит: «Сортировка - это сбор письменной информации в стандартный порядок». В вычислительной технике сопоставление приобрело значение «спецификация такого порядка». Другими словами, сопоставление - это (или подразумевается) определение трехсторонней функции сравнения.
Я думаю, что короткий ответ "определенно возможно". По крайней мере, я знаю о следующих махинациях:
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. Как всегда, обратитесь к документации для вашей конкретной системы баз данных.
источник