Яке зібрання слід вибрати для веб-сайту на мутимічній мові?


25

Чи має порівняння вплив на швидкість запиту? Чи змінюється розмір таблиці залежно від порівняння?

Якщо я хочу створити веб-сайт, який повинен підтримувати всі можливі мови (допустимо, наприклад, Google), що було б рекомендованим порівнянням?

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

Як мені знати, який найкращий вибір зробити? Яке порівняння краще відповідає цій справі?


4
Ви можете перефразувати питання, щоб воно не звучало настільки суб’єктивно - порівняння "найкращого" якою мірою? :)
TML

Нова назва читається набагато краще
TML

Відповіді:


16

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

Ця стаття у Вікіпедії, можливо, висвітлює недоліки кожного.


Так, UTF-8 може обробити 1,1 мільйона кодів Unicode.
vz0

Дякую - я подумав, що в UTF-8 знайшлося кілька персонажів Хана чи подібних, які не підтримуються, добре мати ґрунтовну відповідь.
TML


8

Я думаю, що зазначене питання (2015-20-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") просто порівнює значення точки коду унікоду, тоді як датський ( da_DK.utf8) та німецькі ( de_DE.utf8) місцеположення роблять щось більш складне. Це матиме певний вплив на швидкість запиту, хоча я підозрюю, що це не варто буде турбуватися.

"Чи змінюється розмір таблиці залежно від порівняння?" - Я можу уявити собі індекс відповідно до одного порівняння та інший індекс за іншим порівнянням, або лише один із таких двох індексів із застосованим певним strxfrmперетворенням. У тому гіпотетичному сценарії, якщо є два порівняння з різними розмірами, відповідь - так.

"яке було б рекомендоване порівняння?" - Це залежить від того, чому вам потрібно буде сортувати рядки. Якби лише мати якийсь канонічний спосіб впорядкування рядків, я, мабуть, пішов би з "C". Якщо потрібно представити користувачам дані в упорядкованому порядку відповідно до людських очікувань, і ці очікування формуються відповідно до їх культури, і ви хочете, щоб база даних (а не якийсь інший рівень) проводила сортування, можливо, вам слід створити один індекс на порівняння , тобто принаймні один за da_DK.utf8датчанами і один за de_DE.utf8німцями. Я думаю, що це може стати досить великим досить швидко, хоча.

Все це сильно залежить від внутрішньої роботи вашої бази даних; Я думаю, що це виходить за рамки "стандартизованого" (lol!) SQL. Як завжди, зверніться до документації до вашої конкретної системи баз даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.