Яка різниця між utf8mb4 та utf8 діаграмами в MySQL?


341

Яка різниця між utf8mb4та utf8символами в MySQL ?

Я вже знаю про кодування ASCII , UTF-8 , UTF-16 та UTF-32 ; але мені цікаво дізнатися, у чому різниця utf8mb4групи кодувань з іншими типами кодування, визначеними в MySQL Server .

Чи є якісь особливі переваги / пропозиції використовувати, utf8mb4а не utf8?

Відповіді:


391

UTF-8 - кодування змінної довжини. У випадку UTF-8 це означає, що для зберігання однієї кодової точки потрібно від одного до чотирьох байтів. Однак кодування MySQL під назвою "utf8" (псевдонім "utf8mb3") зберігає максимум три байти на кодову точку.

Отже, набір символів "utf8" / "utf8mb3" не може зберігати всі кодові точки Unicode: він підтримує лише діапазон від 0x000 до 0xFFFF, який називається "базовою багатомовною площиною ". Дивіться також Порівняння кодувань Unicode .

Ось що (попередня версія тієї ж сторінки на) документація MySQL повинна сказати про це:

Набір символів на ім'я utf8 [/ utf8mb3] використовує максимум три байти на символ і містить лише символи BMP. Як і в MySQL 5.5.3, набір символів utf8mb4 використовує максимум чотири байти на символ, що підтримує додаткові символи:

  • Для символу BMP utf8 [/ utf8mb3] та utf8mb4 мають однакові характеристики зберігання: однакові значення коду, однакове кодування, однакова довжина.

  • Для додаткового символу utf8 [/ utf8mb3] символ взагалі не може зберігати , тоді як utf8mb4 для його зберігання потрібні чотири байти. Оскільки utf8 [/ utf8mb3] взагалі не може зберігати символ, у вас немає додаткових символів у стовпцях utf8 [/ utf8mb3], і вам не потрібно турбуватися про перетворення символів або втрату даних під час оновлення даних utf8 [/ utf8mb3] із старих версій MySQL.

Тож якщо ви хочете, щоб ваш стовпець підтримував збереження символів, що лежать поза BMP (і зазвичай ви хочете), наприклад, Emoji , використання «utf8mb4». Див. Також Які найпоширеніші символи Unicode, що не належать до BMP, фактично використовуються? .


10
Єдині випадки, з якими я стикався (поки що), коли utf8mb4 був «необхідний», - це китайці та смайлики. Є незрозумілі алфавіти, які потребують цього.
Рік Джеймс

10
Його також потрібно, якщо ви використовуєте для зберігання зашифрованих паролів та даних у вашій базі даних. Я зберігав зашифрований пароль у mysql, використовуючи звичайний формат utf8, що викликав у мене багато проблем з деякими паролями випадковим чином і дуже важко налагоджувати, тому нарешті я спробував використовувати кодування base64 і виправив проблему тимчасово. Але, тепер я знаю причину.
Мойтаба Резайан

38
Зашифровані дані @idealidea є двійковими, і ви не повинні зберігати двійкові дані у стовпчику varchar. :)
CodeCaster

8
@thomasrutter Спробуйте цей (𡞰) символ зберегти за допомогою UTF-8. :)
502_Geek

2
@MojtabaRezaeian дещо залежно від алгоритму паролів - bcrypt2 видасть ASCII.
Ясен

60

Набір utf8mb4символів корисний, оскільки нині нам потрібна підтримка для зберігання не лише мовних символів, але й символів, нещодавно введених емоджи та ін.

Приємне прочитання про те, як підтримувати повний Unicode в базах даних MySQL Mathias Bynens, також може пролити трохи світла на це.


11
MySQL 8.0 тепер за замовчуванням для набору символів utf8mb4. [ mysql.com/products/enterprise/techspec.html]
Ахмед Резк

47

Взяте з довідкового посібника MySQL 8.0 :

  • utf8mb4: UTF-8, що кодує набір символів Unicode , використовуючи один-чотири байти на символ.

  • utf8mb3: UTF-8, що кодує набір символів Unicode , використовуючи один-три байти на символ.

В MySQL utf8 в даний час є псевдонімом , utf8mb3який є застарілим і треба увійти на сайт майбутньому MySQL випуску. У цей момент utf8 стане посиланням на utf8mb4 .

Отже, незалежно від цього псевдоніма, ви можете свідомо встановити собі utf8mb4 кодування.

Для завершення відповіді я хочу додати коментар @ WilliamEntriken нижче (також взятий із посібника):

Щоб уникнути неоднозначності щодо значення utf8, розгляньте utf8mb4чітко вказати замість посилань набору символів utf8.

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