Що означає співставлення?


138

Що означає зіставлення у SQL і що це робить?


2
@gbn: Між іншим, порівняння працює дуже схожим чином і в MSSQL, і в MySQL.
Пісквор вийшов з будівлі


@Piskvor: За винятком деяких варіантів порівняння mySql (наприклад, UTF8) недоступні в MSSQL: msdn.microsoft.com/en-us/library/ms144250.aspx
CB

@CB: Не заперечуючи цього; подібність йде глибше, ніж (не) підтримувані схеми.
Пісквор вийшов з будівлі

Відповіді:


60

Збір можна вважати просто порядком сортування.

В англійській мові (і це дивно кузен, американець), порівняння може бути досить простою справою, що складається з замовлення за кодом ASCII.

Як тільки ви потрапляєте на ці дивні європейські мови з усіма їх наголосами та іншими особливостями, зіставлення змінюється. Наприклад, хоча різні форми наголосів aможуть існувати в різних кодових точках, їх, можливо, потрібно буде сортувати, як якщо б вони були однією буквою.


4
Різні акценти , як правило , означає , що вони повинні бути відсортовані , як якщо б вони були різні літери - наприклад e, ë, é, ěі è може бути різні літери для цілей впорядкування (але , можливо , та ж буква при пошуку, рис тих божевільних європейців;)).
Пісквор вийшов з будівлі

1
@Piskvor: чи немає у вашій інформації координати, які вказують на певну країну, використовуючи алфавіт з 42літерами, 15з них діакритики?
Quassnoi

4
@Quassnoi: Ну так, і? Чи я десь маю на увазі, що я не божевільний? ; o) (хоча дякую Богові за Unicode, я б
зненацька захопився,

3
@Piskvor: Вибачте, вибачте, ти абсолютно божевільний! :)
Quassnoi

Це лише для сортування чи також для where st= 'aaa'?
Рой Намір

42

Крім того, що "наголошені літери в деяких західноєвропейських мовах сортуються інакше, ніж без наголосів", ви повинні враховувати і групи букв, які іноді також сортуються по-різному.

Традиційно в іспанській мові "ch" вважається буквою самостійно, що відповідає "ll" (обидва вони представляють одну фонему), тому список буде впорядкований так:

  • кабалло
  • цинка
  • кош
  • вугілля
  • шоколад
  • Чуеко
  • дадо
  • (...)
  • lámpara
  • луего
  • ланта
  • lluvia
  • мадера

Зауважте, що всі слова, що починаються з одного c, йдуть разом, за винятком слів, що починаються з ch, що йдуть після них, те саме, що ll - слова, які починаються після всіх слів, починаючи з одного l . Це впорядкування ви побачите в старих словниках та енциклопедіях, іноді навіть сьогодні дуже консервативними організаціями.

Королівська академія мови змінила це, щоб полегшити розміщення іспанської мови в світі обчислень. Тим не менш, ñ все ще вважається іншою буквою, ніж n, і йде за нею, а перед o . Отже, це правильно упорядкований список:

  • Намібія
  • нумеро
  • ñandú
  • ñú
  • обра
  • ojo

Вибравши правильне порівняння, ви все це зробите автоматично для вас :-)


Добре, тому порівняння є досить корисним для правильного сортування, але чи все-таки воно корисне для порівнянь? Наприклад, я хотів би, щоб «ñandú» і «nandu» з практичних причин були рівними ... Чи міг механізм зіставлення допомогти мені в цьому?
КБ

@CB: Якщо ви маєте на увазі щось подібне до вибору всіх рядків, у яких значення стовпця дорівнює "Aéreo", а SQL S. повертає рядки з "aereo", "aereó", "AerEO" тощо - так, встановивши конкретний порядок лише для a запит може це зробити. Однак у вас виникнуть проблеми з продуктивністю, якщо це порівняння сильно відрізняється від рідного. І якщо ви використовуєте тимчасові таблиці, ви також повинні відслідковувати порівняння tempdb ... Але ви це можете зробити.
Джо Пінеда

У цьому випадку ви могли б пояснити трохи більше? Зокрема, чи зможе це зробити прямий запит "ВИБІРТЕ слово ІЗ тесту, де слово LIKE 'nandu"? І яке зіставлення я повинен використовувати, щоб воно працювало? (Зауважте, що мене турбують діакритичні позначки, а не лише акценти ...)
КБ

2
@CB подивіться на "AI" або "AS" частина порівняння (Accent Insensitive and Accent Sensitive).
Дастін Кендалл

14

Правила, які розповідають, як порівнювати та сортувати рядки: порядок букв; чи має значення випадок, чи має значення діакритика тощо.

Наприклад, якщо ви хочете, щоб усі літери були різними (скажімо, якщо ви зберігаєте імена файлів у UNIX), ви використовуєте UTF8_BINпорівняння:

SELECT  'A' COLLATE UTF8_BIN = 'a' COLLATE UTF8_BIN

---
0

Якщо ви хочете ігнорувати відмінності у регістрі та діакритиці (скажімо, для пошукової системи), ви використовуєте UTF8_GENERAL_CIпорівняння:

SELECT  'A' COLLATE UTF8_GENERAL_CI = 'ä' COLLATE UTF8_GENERAL_CI

---
1

Як бачимо, це зіставлення (правило порівняння) вважає Aвеликим літером і замінює äту саму букву, ігноруючи відмінності в регістрі та діакритиці.


10

Збір визначає спосіб сортування та порівняння рядкових значень

Наприклад, він визначає, як поводитися

  • наголоси ( äàaтощо)
  • випадок ( Aa)
  • мовний контекст:
    • У французькому порівнянні, cote < côte < coté < côté.
    • У стандартній програмі Latin1 за замовчуванням SQL Server, cote < coté < côte < côté
  • Сортування ASCII (двійкове порівняння)

5

Збірка означає присвоєння певного порядку символам в алфавіті, скажімо, ASCII або Unicode тощо.

Припустимо, у вашому алфавіті є 3 символи - {A, B, C}. Ви можете визначити деякі приклади зіставлення для нього, призначивши символам цілісні значення

  1. Приклад 1 = {A = 1, B = 2, C = 3}
  2. Приклад 2 = {C = 1, B = 2, A = 3}
  3. Приклад 3 = {B = 1, C = 2, A = 3}

Власне кажучи, ви можете визначити n! порівняння за алфавітом розміру n. Враховуючи такий порядок, різні сортування підпрограм, як LSD / MSD рядки рядків, використовують його для сортування рядків.


3

Збір визначає спосіб сортування та порівняння ваших даних. Це дуже часто важливо щодо інтернаціоналізації, наприклад, як ви сортуєте японські кандзі?

Якщо ви використовуєте сервер Google і сервер sql, ви знайдете безліч статей, що обговорюють це!


3

Посилання взято з цієї статті: Порівнювання - це сукупність правил для порівняння символів у наборі символів. Він також постановив для сортування символів, а правильний порядок двох символів змінюється в залежності від мови. Збірка порівняла два рядки на зразок, якщо слово більше іншого, і сортувати відповідно.

Якщо ви використовуєте набір символів "latin1", ви можете використовувати зіставлення "latin1_swedish_ci".

Ви повинні вибрати правильне порівняння, оскільки неправильне зіставлення може вплинути на продуктивність вашої бази даних.


2

http://en.wikipedia.org/wiki/Коляція

Збір - це складання письмової інформації в стандартне замовлення. (...) Алгоритм зіставлення, такий як алгоритм зіставлення Unicode, визначає порядок за допомогою порівняння двох заданих рядків символів та вирішення того, який повинен бути перед іншим.



1
Ця стаття справді все це пояснює.
Джо Пінеда

3
@Joe Pineda. Може, це справді все це пояснює, але чи хоче читач все це знати? Або, можливо, читач просто хоче стислий, надійний відповідь, який охоплює найбільш фундаментальні та найчастіше використовувані елементи та функції зібрання, щоб він / вона змогла прочитати це швидко і відновити роботу над будь-яким завданням, завданням чи проектом, що викликало питання почати з?
cfwschmidt

2
@TJCrowder Я ціную іронію в цьому

1

Порівняння - це те, як SQL-сервер вирішує, як сортувати та порівнювати текст.

Див. MSDN .

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