Яка різниця між utf8 та utf8mb4?
Працюючи з базами даних MySQL, ви можете зіткнутися з кодуваннями символів utf8 і utf8mb4, які на перший погляд можуть здатися схожими. Однак вони мають суттєві відмінності, які можуть вплинути на те, як зберігаються та відображаються ваші дані, особливо коли ви маєте справу з різноманітними символами та емодзі. Розуміння відмінностей між 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 |
Покриття Unicode | Часткове (виключає 4-байтові символи) | Повне (підтримує всі кодування Unicode) |
Підтримка емодзі | Ні | Так |
Символи CJK | Більшість, але не всі | Всі |
Сумісність | Застарілі бази даних | Рекомендовано для нових проектів |
1. Довжина в байтах
Найважливішою відмінністю між utf8 і utf8mb4 є кількість байт, яку вони використовують для зберігання символів. utf8 підтримує до 3 байт, тоді як utf8mb4 підтримує до 4 байт. Як результат, utf8mb4 може зберігати ширший діапазон символів Unicode.
2. Емодзі та спеціальні символи
Якщо вам потрібно зберігати емодзі або будь-які спеціальні символи, що займають 4 байти, utf8mb4 є єдиним прийнятним варіантом. У utf8 спроба зберегти 4-байтовий символ призведе до помилки, що спричинить потенційну втрату даних або збої в роботі додатків.
3. Сумісність з базами даних
utf8 була стандартним набором символів для багатьох старих інсталяцій MySQL, що робить її сумісною із застарілими системами. Однак для нових проектів і додатків, які повинні підтримувати глобальну аудиторію з різними наборами символів, рекомендовано використовувати utf8mb4.
Чому варто використовувати utf8mb4 замість utf8?
З огляду на обмеження utf8, використання utf8mb4 зазвичай є кращим вибором для сучасних програм. Ось кілька причин, чому слід надавати перевагу utf8mb4:
- Повна підтримка Unicode: utf8mb4 дозволяє зберігати всі символи Unicode, включаючи емодзі, які стають все більш поширеними у користувацькому контенті.
- Перспективність: Коли до стандарту Unicode додаються нові символи, utf8mb4 гарантує, що ваша база даних зможе їх обробляти.
- Глобальна сумісність: З utf8mb4 вам не потрібно турбуватися про сумісність наборів символів для різних мов і спеціальних символів.
Коли все ж варто використовувати utf8?
Існує кілька сценаріїв, в яких utf8 все ще може розглядатися:
- Місце для зберігання даних: Оскільки utf8mb4 використовує до 4 байт на символ, це може призвести до дещо більшого розміру бази даних порівняно з utf8. Однак, ця різниця часто є незначною для більшості додатків.
- Застарілі системи: Якщо у вас є програма або база даних, яка використовує utf8, і вам не потрібно зберігати 4-байтові символи, перемикання може не знадобитися.
Як перетворити базу даних з utf8 в utf8mb4
Якщо ви вирішили перенести існуючу базу даних MySQL з utf8 на utf8mb4, необхідно виконати кілька кроків для забезпечення плавного переходу. Ось загальний посібник з конвертації бази даних для використання utf8mb4.
Крок 1: Створіть резервну копію бази даних
Перш ніж вносити будь-які зміни, завжди створюйте резервну копію бази даних, щоб запобігти втраті даних:
mysqldump -u ім'я_користувача -p назва_бази_даних > database_backup.sql
Крок 2: Зміна набору символів і зіставлення
Виконайте наступні команди SQL, щоб змінити набір символів і зіставлення вашої бази даних, таблиць і стовпців на utf8mb4:
ALTER DATABASE назва_бази даних 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]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Перезапустіть MySQL, щоб застосувати зміни:
sudo service mysql restart
Крок 4: Перевірте зміни
Переконайтеся, що набір символів було успішно оновлено:
SHOW VARARIES LIKE 'character_set%';
SHOW VARARIES LIKE 'collation%';
На виході ви маєте отримати utf8mb4 як набір символів для вашої бази даних.