Кодування символів є основою того, як дані зберігаються, запитуються та відображаються в сучасних додатках і хостингових середовищах. Якщо ви використовуєте веб-сайт або веб-додаток на віртуальному хостингу, VPS або виділеному сервері на базі MySQL або MariaDB, ви, ймовірно, стикалися з термінами utf8 і utf8mb4. На перший погляд, вони здаються синонімами – обидва представляють кодування Unicode. Але за ними ховається критична відмінність, яка може покращити або погіршити здатність вашого додатку зберігати сучасні текстові дані, такі як емодзі, багатомовний контент або певні символи CJK (китайської, японської, корейської) – особливо в інтернаціоналізованих або багатомовних хостингових рішеннях.
utf8
Застаріле кодування Unicode в MySQL.
Підтримує лише 3 байти на символ.
Здатна зберігати символи в базовій багатомовній площині (BMP): від U 0000 до U FFFF.
Не може зберігати емодзі, музичні символи, деякі китайські ієрогліфи та інші додаткові символи.
utf8mb4
(Multi-Byte 4)Реальна реалізація UTF-8.
Підтримує повний Юнікод, включаючи символи за межами BMP.
Використовує до 4 байт на символ – так, якбуло розроблено UTF-8.
Необхідна для зберігання емодзі (😊), рідкісних китайських ієрогліфів (𠀋) або математичних символів (𝛑).
У MySQL набір символів utf8 не є повною реалізацією стандарту UTF-8. Він обмежений 3 байтами, тоді як стандартний UTF-8 використовує до 4 байт. Це означає, що
utf8 в MySQL не є справжнім UTF-8.
Це більше схоже на підмножину UTF-8, яка виключає кодові точки за межами U FFFF.
На противагу цьому, utf8mb4 повністю відповідає стандарту UTF-8.
Функція | utf8 | utf8mb4 |
---|---|---|
Максимальна кількість байт на символ | 3 | 4 |
Покриття Unicode | До U FFFF (тільки BMP) | Повний діапазон (до U 10FFFF) |
Підтримка емодзі | ❌ Ні | ✅ Так |
Підтримка додаткових символів | ❌ Ні | ✅ Так |
Сумісність з MySQL | ✅ Сумісність із застарілими версіями | ✅ Повний Юнікод |
Можливості зіставлення | Обмежені | Більш широкі (наприклад, utf8mb4_0900_ai_ci) |
Ви не можете зберігати 🐱, 🧠, 🚀 або 🇩🇪, використовуючи utf8 MySQL. Вони знаходяться за межами BMP.
utf8mb4 підтримує нові зіставлення, такі як:
utf8mb4_unicode_ci: сортування за стандартом Unicode
utf8mb4_general_ci: Швидке, але менш точне
utf8mb4_0900_ai_ci: Сучасне зіставлення з урахуванням Unicode 9.0 (доступне в MySQL 8)
Оскільки Unicode розширюється, нові символи будуть виходити за межі 3-байтового діапазону. utf8mb4 гарантує, що ви не втратите доступ до майбутніх символів.
Якщо ви спробуєте вставити 4-байтовий символ (наприклад, емодзі) у стовпець з , ви отримаєте цю помилку:
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x81' for column 'title' at row 1
Гірше того, ваша програма може непомітно обрізати або пошкодити дані, якщо їх не буде належним чином перевірено.
Щоб безпечно перенести вашу схему:
Переконайтеся, що ваш додаток підключається з використанням utf8mb4:
завжди використовуйте utf8mb4 для нових баз даних.
використовуйте utf8mb4_unicode_ci для точності або utf8mb4_general_ci для продуктивності.
встановіть кодування за замовчуванням на рівні таблиць та баз даних.
переконайтеся, що бібліотеки прикладного рівня (наприклад, PDO, MySQLi, Sequelize) підтримують utf8mb4.
Різниця між utf8 і utf8mb4 в MySQL – це не просто байт – це різниця між сучасною сумісністю з Unicode і тихим збоєм. Хоча utf8 залишається сумісним з попередніми версіями, він є застарілим для багатьох сучасних випадків використання. Завжди віддавайте перевагу utf8mb4, щоб захистити свій додаток на майбутнє і забезпечити повну багатомовність, підтримку емодзі та спеціальних символів.