MySQL utf8 vs utf8mb4: у чому різниця між utf8 і utf8mb4?
Під час роботи з базами даних MySQL ви можете зіткнутися з кодуваннями символів utf8 і utf8mb4, які на перший погляд можуть здатися схожими. Однак вони мають суттєві відмінності, які можуть вплинути на зберігання та відображення даних, особливо під час роботи з різноманітними символами та emojis. Розуміння відмінностей між utf8 і utf8mb4 має вирішальне значення для вибору правильного набору символів для вашої бази даних і забезпечення правильного зберігання даних.
У цій статті ми розглянемо відмінності між utf8 і utf8mb4 в MySQL, причини появи utf8mb4 і способи міграції вашої бази даних на utf8mb4, якщо це необхідно.
Що таке utf8 у MySQL?
У MySQL набір символів utf8 історично використовувався для зберігання даних Unicode. Він був призначений для підтримки всіх символів Unicode, що робить його придатним для більшості текстових даних, включно з багатьма мовами та спеціальними символами. Однак реалізація utf8 у MySQL підтримує тільки підмножину повного стандарту UTF-8.
Скільки байт використовує utf8?
Набір символів utf8 у MySQL кодує символи, використовуючи від 1 до 3 байт на символ. Це означає, що він не може представляти символи, які потребують 4 байти, як-от деякі смайлики та деякі менш поширені китайські, японські та корейські (CJK) символи. Якщо ви спробуєте зберегти такі 4-байтові символи в стовпці utf8, MySQL поверне помилку, що призведе до збоїв під час вставки даних.
Приклад непідтримуваних символів в utf8:
- Емодзі, такі як 😊, 🚀 і ❤️.
- Деякі рідкісні символи CJK.
- Математичні символи та інші спеціалізовані символи Unicode.
Це обмеження призвело до впровадження utf8mb4 у MySQL.
Що таке utf8mb4 у MySQL?
Набір символів utf8mb4 в MySQL є справжньою реалізацією повного стандарту UTF-8. Він підтримує від 1 до 4 байт на символ, що дає змогу використовувати весь набір символів Unicode. Сюди входять усі символи, які підтримує utf8, а також додаткові 4-байтові символи, які utf8 не підтримує.
Чому було представлено utf8mb4?
MySQL представила utf8mb4, щоб усунути недоліки utf8. За допомогою utf8mb4 ви можете зберігати будь-які допустимі символи Unicode, включно з емодзі, музичними нотами, математичними символами і всім набором символів CJK. Це робить utf8mb4 кращим набором символів для сучасних додатків, яким потрібна підтримка широкого спектра текстових даних.
Основні відмінності між utf8 і utf8mb4
Характеристика | utf8 | utf8mb4 |
Байт на символ | 1-3 | 1-4 |
Охоплення Юнікоду | Часткове (виключає 4-байтові символи) | Повне (підтримує весь Юнікод) |
Підтримка емодзі | Ні | Так |
Символи CJK | Більшість, але не всі | Усі |
Сумісність | Застарілі бази даних | Рекомендується для нових проєктів |
1. Довжина байта
Найсуттєвіша відмінність між utf8 і utf8mb4 полягає в кількості байтів, які використовуються для зберігання символів. utf8 підтримує до 3 байтів, а utf8mb4 – до 4 байтів. У результаті utf8mb4 може зберігати ширший діапазон символів Юнікоду.
2. Емодзі та спеціальні символи
Якщо вам потрібно зберігати емодзі або будь-які спеціальні символи, що вимагають 4 байти, utf8mb4 – єдиний прийнятний варіант. При використанні utf8 спроба зберегти 4-байтовий символ призведе до помилки, що може призвести до втрати даних або збоїв у роботі додатків.
3. Сумісність із базами даних
utf8 був набором символів за замовчуванням для багатьох старих інсталяцій MySQL, що робить його сумісним із застарілими системами. Однак для нових проєктів і додатків, які повинні підтримувати глобальну аудиторію з різними наборами символів, тепер рекомендується використовувати utf8mb4.
Чому варто використовувати utf8mb4 замість utf8?
З огляду на обмеження utf8, використання utf8mb4 загалом є найкращим вибором для сучасних додатків. Ось кілька причин віддати перевагу utf8mb4:
- Повна підтримка Юнікоду: utf8mb4 дає змогу зберігати всі символи Юнікоду, включно з смайликами, які стають дедалі більш поширеними в користувацькому контенті.
- Перспективність: У міру додавання нових символів у стандарт Unicode, utf8mb4 гарантує, що ваша база даних зможе їх обробляти.
- Глобальна сумісність: З utf8mb4 вам не потрібно турбуватися про сумісність наборів символів для різних мов і спеціальних символів.
Коли все ж слід використовувати utf8?
Є кілька сценаріїв, у яких utf8 все ж варто використовувати:
- Місце для зберігання даних: Оскільки utf8mb4 використовує до 4 байт на символ, це може призвести до дещо більшого розміру бази даних порівняно з utf8. Однак для більшості додатків ця різниця часто незначна.
- Успадковані системи: Якщо у вас є наявний додаток або база даних, що використовує utf8, і вам не потрібно зберігати 4-байтові символи, перемикання може не знадобитися.
Як перетворити базу даних з utf8 на utf8mb4
Якщо ви вирішили перевести наявну базу даних MySQL з utf8 на utf8mb4, це передбачає кілька кроків для забезпечення плавного переходу. Ось загальний посібник із конвертації бази даних в utf8mb4.
Крок 1: Резервне копіювання бази даних
Перш ніж вносити будь-які зміни, завжди робіть резервну копію бази даних, щоб запобігти втраті даних:
mysqldump -u username -p database_name > database_backup.sql
Крок 2: Змініть набір символів і колляцію
Виконайте такі SQL-команди, щоб змінити набір символів і коляцію вашої бази даних, таблиць і стовпців на utf8mb4:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Для кожної таблиці виконайте команду:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Це змінить набір символів і колізію для зазначеної таблиці та її стовпців.
Крок 3: Оновлення файлу конфігурації
Щоб нові таблиці та стовпці за замовчуванням використовували utf8mb4, оновіть конфігураційний файл MySQL (my.cnf або my.ini) з такими налаштуваннями:
[client]
default-character-set = utf8mb4
[mysql]
набір символів за замовчуванням = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Перезапустіть MySQL, щоб застосувати зміни:
sudo service mysql restart
Крок 4: Перевірте зміни
Перевірте, що набір символів було успішно оновлено:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
У результаті ви повинні побачити utf8mb4 як набір символів для вашої бази даних.