Що конкретно означає набір символів та зіставлення?


315

Я можу прочитати документацію MySQL, і це досить зрозуміло. Але як вирішити, який символ використовувати? На які дані впливає порівняння?

Я прошу пояснення двох і як їх вибрати.

Відповіді:


511

З документів MySQL :

Набір символів - це набір символів та кодувань. Звірка являє собою набір правил для порівняння символів в наборі символів. Зробимо чітке розмежування на прикладі уявного набору символів.

Припустимо, у нас є алфавіт з чотирма літерами: 'A', 'B', 'a', 'b'. Кожній букві даємо число: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. Буква 'A' є символом, число 0 - кодуванням для 'A' , а поєднання всіх чотирьох літер та їх кодування - це набір символів.

Тепер припустимо, що ми хочемо порівняти два значення рядка: "A" і "B". Найпростіший спосіб зробити це - подивитися кодування: 0 для "A" і 1 для "B". Оскільки 0 менше 1, ми кажемо, що "A" менше, ніж "B". Тепер, що ми тільки що зробили, це застосувати порівняння до набору символів. Порівняння - це набір правил (у цьому випадку лише одне правило): "порівняйте кодування". Цей найпростіший з усіх можливих зіставлень ми називаємо двійковим порівнянням.

Але що робити, якщо ми хочемо сказати, що малі та великі літери рівнозначні? Тоді ми мали б принаймні два правила: (1) трактувати малі літери 'a' і 'b' як еквівалентні 'A' і 'B'; (2) потім порівняйте кодування. Ми називаємо це співставленням, що не враховує регістр. Це трохи складніше, ніж двійкове порівняння.

У реальному житті більшість наборів символів має багато символів: не лише букви «А» та «В», а цілі алфавіти, іноді кілька алфавітів або східні системи письма з тисячами символів, а також багато спеціальних символів та розділових знаків. Також у реальному житті у більшості зіставлень є багато правил: не лише нечутливість до випадків, а й нечутливість до акцентів ("наголос" - знак, прикріплений до символу, як у німецькій мові "ö") та відображення з декількома символами (наприклад, правило, що " ö '=' OE 'в одному з двох німецьких зіставлень).


206

Кодування символів являє собою спосіб кодування символів , так що вони підходять в пам'яті. Тобто, якщо набір символів ISO-8859-15, символ євро, €, буде кодований як 0xa4, а в UTF-8 - 0xe282ac.

Звірка як порівнювати символи, в latin9, є літери , як e é è ê f, якщо упорядковано відповідно до їх бінарного поданням, він буде йтиe f é ê è , але якщо параметри сортування встановлено, наприклад, французький, ви будете мати їх в порядку , ви думали , що вони було б, що всі e é è êрівні, і тоді f.


5
Важливо зауважити, що для однієї групи може бути багато різних зіставлень. Той, що є правильним, залежить від семантики тексту, яка зазвичай визначається мовою, на якій написано.
Філ

20

Набір символів - це підмножина всіх написаних гліфів. Кодування символів визначає, як ці символи відображаються на числові значення. Деякі кодування символів, такі як UTF-8 та UTF-16, можуть кодувати будь-який символ у Універсальному наборі символів. Інші, як US-ASCII або ISO-8859-1, можуть кодувати лише невелику підмножину, оскільки вони використовують 7 та 8 біт на символ відповідно. Оскільки багато стандартів визначають як набір символів, так і кодування символів, термін "набір символів" часто вільно замінюється на "кодування символів".

Порівняння містить правила, які визначають, як символи можна порівняти для сортування. Правила зібрань можуть бути специфічними для місцевого значення: правильний порядок двох символів змінюється в залежності від мови.

Вибір набору символів та порівняння зводиться до того, чи є ваша програма інтернаціоналізована чи ні. Якщо ні, то на яку місцевість ви орієнтуєтесь?

Для того, щоб вибрати, який набір символів ви хочете підтримати, ви повинні розглянути свою заявку. Якщо ви зберігаєте вхід, що надається користувачем, може бути важко передбачити всі локалі, в яких згодом буде використовуватися ваше програмне забезпечення. Щоб підтримати їх усіх, можливо, найкраще підтримати UCS (Unicode) з самого початку. Однак на це є вартість; тепер для багатьох західноєвропейських символів буде потрібно два байти зберігання на один символ, а не один.

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


Вибачте чувак, я лише початківець і просто потребую вашого уточнення. Отже, чи можу я зрозуміти таке зіставлення, саме це гарантує належне розпізнавання кожного символу (будь то латинський чи китайський) та надано відповідні кодування. Це правильно? Сподіваюся на вашу відповідь
Мирич

1
@Mirich Ні, порівняння - це інформація про сортування символів. У різних регіонах світу воліють сортувати персонажів по-різному.
еріксон

3

Я пропоную використовувати utf8mb4_unicode_ci, який ґрунтується на стандарті Unicode для сортування та порівняння, який точно сортує у дуже широкому діапазоні мов.


3
від ОП: "Я прошу пояснення двох та як їх вибрати"
Dan Esparza

1
@simhumileco, вибачте чувак, я лише початківець і просто потребую вашого уточнення. Отже, чи можу я зрозуміти таке зіставлення, саме це гарантує належне розпізнавання кожного символу (будь то латинський чи китайський) та надано відповідні кодування. Це правильно? Сподіваюся на вашу відповідь
Мирич

1
@Mirich Все залежить від того, яке кодування ви використовуєте в інших місцях, якщо ви використовуєте UTF-8кодування в системі за межами бази даних, то все, що знаходиться в базі даних, також має бути належним чином записане, якщо ви використовуєте utf8mb4в MySQL . Якщо мова йде про правильну операцію сортування, порівняння та перетворення тексту для конкретних символів в MySQL , важко знайти ідеальне рішення, але *_unicode_ci, безумовно, краще, ніж *_general, але воно також має свої недоліки. Прочитайте: dev.mysql.com/doc/refman/8.0/uk/charset-unicode-sets.html
simhumileco
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.