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

Кодування символів є основою того, як дані зберігаються, запитуються та відображаються в сучасних додатках і хостингових середовищах. Якщо ви використовуєте веб-сайт або веб-додаток на віртуальному хостингу, 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.

  • Необхідна для зберігання емодзі (😊), рідкісних китайських ієрогліфів (𠀋) або математичних символів (𝛑).

Оманливий utf8 в MySQL

У MySQL набір символів utf8 не є повною реалізацією стандарту UTF-8. Він обмежений 3 байтами, тоді як стандартний UTF-8 використовує до 4 байт. Це означає, що

  • utf8 в MySQL не є справжнім UTF-8.

  • Це більше схоже на підмножину UTF-8, яка виключає кодові точки за межами U FFFF.

На противагу цьому, utf8mb4 повністю відповідає стандарту UTF-8.

Технічне порівняння

Функціяutf8utf8mb4
Максимальна кількість байт на символ34
Покриття UnicodeДо U FFFF (тільки BMP)Повний діапазон (до U 10FFFF)
Підтримка емодзі❌ Ні✅ Так
Підтримка додаткових символів❌ Ні✅ Так
Сумісність з MySQL✅ Сумісність із застарілими версіями✅ Повний Юнікод
Можливості зіставленняОбмеженіБільш широкі (наприклад, utf8mb4_0900_ai_ci)

Чому utf8mb4 – правильний вибір

1. Підтримка емодзі та сучасних символів

Ви не можете зберігати 🐱, 🧠, 🚀 або 🇩🇪, використовуючи utf8 MySQL. Вони знаходяться за межами BMP.

2. Краще зіставлення та сортування

utf8mb4 підтримує нові зіставлення, такі як:

  • utf8mb4_unicode_ci: сортування за стандартом Unicode

  • utf8mb4_general_ci: Швидке, але менш точне

  • utf8mb4_0900_ai_ci: Сучасне зіставлення з урахуванням Unicode 9.0 (доступне в MySQL 8)

3. Перспективи на майбутнє

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

Що станеться, якщо використовувати utf8?

Якщо ви спробуєте вставити 4-байтовий символ (наприклад, емодзі) у стовпець з , ви отримаєте цю помилку:

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x81' for column 'title' at row 1

Гірше того, ваша програма може непомітно обрізати або пошкодити дані, якщо їх не буде належним чином перевірено.

Міграція з utf8 на utf8mb4

Щоб безпечно перенести вашу схему:

Крок 1: Оновлення визначень таблиць і стовпців

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Крок 2: Оновлення налаштувань бази даних за замовчуванням

ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Крок 3: Оновлення налаштувань підключення додатку

Переконайтеся, що ваш додаток підключається з використанням utf8mb4:

SET NAMES utf8mb4;

Кращі практики

  • завжди використовуйте utf8mb4 для нових баз даних.

  • використовуйте utf8mb4_unicode_ci для точності або utf8mb4_general_ci для продуктивності.

  • встановіть кодування за замовчуванням на рівні таблиць та баз даних.

  • переконайтеся, що бібліотеки прикладного рівня (наприклад, PDO, MySQLi, Sequelize) підтримують utf8mb4.

Висновок

Різниця між utf8 і utf8mb4 в MySQL – це не просто байт – це різниця між сучасною сумісністю з Unicode і тихим збоєм. Хоча utf8 залишається сумісним з попередніми версіями, він є застарілим для багатьох сучасних випадків використання. Завжди віддавайте перевагу utf8mb4, щоб захистити свій додаток на майбутнє і забезпечити повну багатомовність, підтримку емодзі та спеціальних символів.