Я можу прочитати документацію MySQL, і це досить зрозуміло. Але як вирішити, який символ використовувати? На які дані впливає порівняння?
Я прошу пояснення двох і як їх вибрати.
Я можу прочитати документацію MySQL, і це досить зрозуміло. Але як вирішити, який символ використовувати? На які дані впливає порівняння?
Я прошу пояснення двох і як їх вибрати.
Відповіді:
З документів 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 'в одному з двох німецьких зіставлень).
Кодування символів являє собою спосіб кодування символів , так що вони підходять в пам'яті. Тобто, якщо набір символів ISO-8859-15, символ євро, €, буде кодований як 0xa4, а в UTF-8 - 0xe282ac.
Звірка як порівнювати символи, в latin9, є літери , як e é è ê f
, якщо упорядковано відповідно до їх бінарного поданням, він буде йтиe f é ê è
, але якщо параметри сортування встановлено, наприклад, французький, ви будете мати їх в порядку , ви думали , що вони було б, що всі e é è ê
рівні, і тоді f
.
Набір символів - це підмножина всіх написаних гліфів. Кодування символів визначає, як ці символи відображаються на числові значення. Деякі кодування символів, такі як UTF-8 та UTF-16, можуть кодувати будь-який символ у Універсальному наборі символів. Інші, як US-ASCII або ISO-8859-1, можуть кодувати лише невелику підмножину, оскільки вони використовують 7 та 8 біт на символ відповідно. Оскільки багато стандартів визначають як набір символів, так і кодування символів, термін "набір символів" часто вільно замінюється на "кодування символів".
Порівняння містить правила, які визначають, як символи можна порівняти для сортування. Правила зібрань можуть бути специфічними для місцевого значення: правильний порядок двох символів змінюється в залежності від мови.
Вибір набору символів та порівняння зводиться до того, чи є ваша програма інтернаціоналізована чи ні. Якщо ні, то на яку місцевість ви орієнтуєтесь?
Для того, щоб вибрати, який набір символів ви хочете підтримати, ви повинні розглянути свою заявку. Якщо ви зберігаєте вхід, що надається користувачем, може бути важко передбачити всі локалі, в яких згодом буде використовуватися ваше програмне забезпечення. Щоб підтримати їх усіх, можливо, найкраще підтримати UCS (Unicode) з самого початку. Однак на це є вартість; тепер для багатьох західноєвропейських символів буде потрібно два байти зберігання на один символ, а не один.
Вибір правильного порівняння може сприяти ефективності, якщо ваша база даних використовує порівняння для створення індексу, а пізніше використовує цей індекс для надання відсортованих результатів. Однак, оскільки правила зіставлення часто залежать від локального характеру, цей індекс буде марним, якщо вам потрібно буде сортувати результати відповідно до правил іншого локалу.
Я пропоную використовувати utf8mb4_unicode_ci
, який ґрунтується на стандарті Unicode для сортування та порівняння, який точно сортує у дуже широкому діапазоні мов.
UTF-8
кодування в системі за межами бази даних, то все, що знаходиться в базі даних, також має бути належним чином записане, якщо ви використовуєте utf8mb4
в MySQL . Якщо мова йде про правильну операцію сортування, порівняння та перетворення тексту для конкретних символів в MySQL , важко знайти ідеальне рішення, але *_unicode_ci
, безумовно, краще, ніж *_general
, але воно також має свої недоліки. Прочитайте: dev.mysql.com/doc/refman/8.0/uk/charset-unicode-sets.html