1. Головна
  2. Колонка автора
  3. Кодування Utf8mb4 у MySQL

Кодування Utf8mb4 у MySQL

Кодування Utf8mb4 у MySQLУ MySQL кодування Utf8 використовує максимум 3 байти на символ і включає тільки BMP (основна багатомовна площина (0000-FFFF) символи. Але цього іноді буває недостатньо, оскільки сьогодні існують символи, які займають більше 3 байт. Наприклад, символи таблиці Unicode Emoji. Для вирішення проблем зі збереженням символів, починаючи з версії MySQL 5.5.3, з’явилося кодування utf8mb4, яке використовує максимум 4 байти на символ і підтримує додаткові символи. BMP символи Utf8 та Utf8mb4 мають однакові характеристики зберігання: однаковий код, однакове кодування, однакову довжину. При переході на пізнішу версію MySQL можна не турбуватися про втрату даних у стовпцях, оскільки кодування Utf8 не може зберігати всі символи.
Incorrect string value: \xF0\x9F\x91\x8A\xD0\xA7...
У вас така ж помилка? Ось ви і знаєте причину втрати інформації при збереженні у кодуванні Utf8, яке не зберігало символи, що не поміщаються в 3 байти.

Для усунення помилки необхідно зробити кілька змін. Але насамперед необхідно перевірити версію бази даних. Для цього виконуємо код:
$mysqli = new mysqli("host", "username", "password");
echo mysqli_get_server_info($mysqli);
Якщо версія нижче 5.5.3, необхідно оновити версію сервера MySQL.
Обов’язково створіть резервні копії всіх баз даних!

Почнемо з кодування бази даних:
ALTER DATABASE <database> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Наступною дією необхідно змінити кодування таблиці:
ALTER TABLE <database>.<table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Стовпці типу TEXT змінюються на MEDIUMTEXT, а стовпці MEDIUMTEXT замінюються на LONGTEXT.

Також можна змінювати кодування окремих стовпців:
ALTER TABLE <database>.<table_name> MODIFY <column_name> TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Кодування utf8mb4 використовує 4 байти на символ, замість 3 як було в uft8. Але при конвертації довжина в байтах для стовпця чи індексу залишається незмінною. Наприклад, тип TEXT може зберегти 64КБ. Якщо кожен символ зберігає 3 байти, у цей тип може поміститися 21845 трибайтних символів. Відповідно, якщо кожен символ займає 4 байти, максимально допустимо 16383 чотирибайтні символи. З цього випливає, що ви не зможете записати в дане поле більше 16383 символів після конвертації. Якщо вам потрібно зберігати більше символів, необхідно змінити тип поля на MEDIUMTEXT.

Також в конфігураційних налаштуваннях сервера змініть наступні налаштування:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Редакція «КовельPost» може не поділяти думку блогерів або дописувачів. За зміст публікацій і їх достовірність відповідальність несуть автори.

Коментарі

  • Дмитро
    Дякую, вирішив проблему! Раніше при додаванні на сайт коментаря з символом 😉 текст після цього символу відразу обривався. Оновив кодування таблиці та полів – все працює чудово!
    Відповісти
  • Володимир
    Дякую! Коротко та по справі!
    Відповісти

Підписуйтесь на наш канал у Telegram! 🚀

@kovelpost