Я думаю, що зазначене питання (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. Як завжди, зверніться до документації до вашої конкретної системи баз даних.