У світі сучасних веб-сайтів дедалі більшого значення набуває підтримка різноманітних мов і наборів символів. З розвитком глобалізації потреба у зберіганні та обробці багатомовних даних стала нагальною. MySQL, одна з найпопулярніших систем управління реляційними базами даних, розуміє цю потребу і запровадила utf8mb4 у версії 8.0, що кардинально змінило правила гри. У цій статті ми розглянемо utf8mb4
та його переваги в MySQL 8.0, підкріплені практичними прикладами.
Що таке utf8mb4
Перш ніж зануритися в переваги, розберемося, що являє собою utf8mb4
. У MySQL "utf8
" означає кодування символів, яке підтримує набір символів Unicode, використовуючи максимум три байти на символ. Однак оригінальна реалізація utf8
в MySQL не охоплює всі символи Unicode. utf8mb4
, з іншого боку, є модифікованою версією utf8
, яка підтримує повний набір символів Unicode, включаючи емодзі та інші додаткові символи, використовуючи максимум чотири байти на символ.
Оригінальна реалізація utf8
в MySQL підтримує лише символи з базової багатомовної площини (BMP), що становить близько 90% всіх символів Unicode. utf8mb4
, з іншого боку, підтримує весь набір символів Unicode, включаючи емодзі та інші додаткові символи. Для цього він використовує максимум чотири байти на символ замість трьох байт, які це робить utf8
.
Ось таблиця, яка показує різницю між utf8
і utf8mb4
:
Особливість | utf8 | utf8mb3 | utf8mb4 |
---|---|---|---|
Максимальна кількість байтів на символ | 3 | 3 | 4 |
Підтримувані символи | Базовий багатомовний план (BMP) | BMP | BMP + Додатковий багатомовний план |
За замовчуванням у MySQL | Так | Так | Так (починаючи з MySQL 8.0) |
Статус застарілості | Застарілий | Застарілий | Не застарілий |
Примітка: Історично MySQL використовувала набір символів utf8 як псевдонім для utf8mb3. Однак, починаючи з MySQL 8.0.28, utf8mb3 використовується лише у виведенні операторів SHOW і в таблицях Інформаційної схеми, коли вони посилаються на цей набір символів. В майбутньому очікується, що utf8 стане посиланням на utf8mb4. Щоб уникнути будь-яких двозначностей, рекомендується явно вказувати utf8mb4, коли ви посилаєтеся на цей набір символів.
Як бачите, основна відмінність між utf8
, utf8mb3
і utf8mb4
полягає в максимальній кількості байт на символ. utf8
і utf8mb3
можуть зберігати символи лише в основній багатомовній площині (BMP), тоді як utf8mb4
може також зберігати символи в додатковій площині. Це означає, що utf8mb4
може підтримувати ширший діапазон символів, включно зі смайликами, математичними символами та іншими спеціальними символами.
Ще одна відмінність між цими трьома наборами символів полягає в їхньому статусі за замовчуванням в MySQL. utf8
є набором символів за замовчуванням в MySQL 5.7 і старших версіях, тоді як utf8mb3
є набором символів за замовчуванням в MySQL 8.0. Однак, utf8mb4
є набором символів за замовчуванням в MySQL 8.0.28 і новіших версіях.
Нарешті, utf8
і utf8mb3
є застарілими в MySQL 8.0. Це означає, що з часом вони будуть видалені з MySQL, тому рекомендується використовувати замість них utf8mb4
.
Отже, якщо вам потрібно зберігати всі символи Unicode, включаючи емодзі та інші додаткові символи, то вам слід використовувати utf8mb4
. Однак, якщо вам потрібно зберігати тільки символи з BMP, то utf8
може бути достатньо.
Ось приклад порівняння utf8
і utf8mb4
з використанням таблиць і запитів MySQL:
MySQL 5.7
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.42-46 |
+-----------+
Таблиця
mysql> CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) CHARACTER SET utf8,
email VARCHAR(255) CHARACTER SET utf8
);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table usersG
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
Додаємо три рядки в таблицю користувачів, включаючи емодзі.
mysql> INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com'),
('𝌆', 'emoji@example.com');
ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3
mysql>
Повідомлення про помилку "ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3,
" свідчить про те, що існує проблема з кодуванням символів, які використовуються для стовпця name
у таблиці users
. Помилка виникла під час спроби вставити Unicode символ 𝌆 у стовпець name
.
mysql> INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com')
;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL 8.0
mysql> select version();
+-------------------------+
| version() |
+-------------------------+
| 8.0.33-0ubuntu0.22.04.2 |
+-------------------------+
Таблиця
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) CHARACTER SET utf8,
email VARCHAR(255) CHARACTER SET utf8
);
mysql> show create table usersG
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
Ця таблиця використовує набір символів utf8mb3
для стовпців з іменами та адресами електронної пошти. Це означає, що таблиця може зберігати всі символи з BMP, але не може зберігати емодзі або інші додаткові символи.
INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com'),
('𝌆', 'emoji@example.com');
Як і в попередньому прикладі, повідомлення про помилку "ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3,
" свідчить про те, що існує проблема з кодуванням символів, які використовуються для стовпця name
у таблиці users
. Помилка виникла під час спроби вставити символ Unicode 𝌆 у стовпчик name
.
mysql> INSERT INTO users (name, email) VALUES
-> ('Arun Jith', 'arunjith@example.com'),
-> ('Jane Doe', 'janedoe@example.com'),
-> ('𝌆', 'emoji@example.com');
ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3
mysql> INSERT INTO users (name, email) VALUES
-> ('Arun Jith', 'arunjith@example.com'),
-> ('Jane Doe', 'janedoe@example.com')
-> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Цей запит вставляє перші два рядки в таблицю users. Перші два рядки містять прості текстові дані, а третій рядок містить емодзі. Емодзі не буде коректно збережено в базі даних, оскільки набір символів utf8
не може зберігати емодзі.
Результат
mysql> SELECT * FROM users;
+----+-----------+----------------------+
| id | name | email |
+----+-----------+----------------------+
| 4 | Arun Jith | arunjith@example.com |
| 5 | Jane Doe | janedoe@example.com |
+----+-----------+----------------------+
2 rows in set (0.00 sec)
Цей запит вибере два рядки з таблиці users. Результатом запиту буде список усіх рядків у таблиці users, включаючи ім'я, електронну пошту та ідентифікатор кожного користувача. Третій рядок з емодзі не може бути збережений, і під час вставки виникла помилка, оскільки набір символів utf8 не може зберігати емодзі.
Таблиця:
Щоб забезпечити правильне зберігання емодзі, створимо стовпці таблиці, використовуючи набір символів utf8mb4. Після цього ми можемо перейти до перевірки правильності вставки емодзі.
mysql> CREATE TABLE users (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(255) CHARACTER SET utf8mb4,
-> email VARCHAR(255) CHARACTER SET utf8mb4
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> show create table usersG
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
SQL запит
INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com'),
('𝌆', 'emoji@example.com');
mysql> INSERT INTO users (name, email) VALUES
-> ('Arun Jith', 'arunjith@example.com'),
-> ('Jane Doe', 'janedoe@example.com'),
-> ('𝌆', 'emoji@example.com');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
Ця таблиця використовує набір символів utf8mb4
як для стовпців імені, так і для електронної пошти. Це означає, що таблиця може зберігати всі символи з повного набору символів Unicode, включно зі смайликами та іншими додатковими символами.
Цей запит вставляє три рядки в таблицю users. Перші два рядки містять прості текстові дані, а третій рядок містить емодзі. Емодзі буде коректно збережено у базі даних, оскільки набір символів utf8mb4
може зберігати емодзі.
Результат:
mysql> SELECT * FROM users;
+----+-----------+----------------------+
| id | name | email |
+----+-----------+----------------------+
| 1 | Arun Jith | arunjith@example.com |
| 2 | Jane Doe | janedoe@example.com |
| 3 | 𝌆 | emoji@example.com |
+----+----------+-----------------------+
3 rows in set (0.00 sec)
Цей запит вибере всі рядки з таблиці users. Результатом запиту буде список усіх рядків, включаючи ім'я, електронну пошту та ідентифікатор кожного користувача. Емодзі буде збережено як емодзі, оскільки набір символів utf8mb4
може зберігати емодзі.
Висновок
Як ви бачите, набір символів utf8mb4
може зберігати всі символи з повного набору символів Unicode, включаючи емодзі та інші додаткові символи. Це робить його гарним вибором для зберігання складних текстових даних, текстового пошуку та порівнянь. З іншого боку, набір символів utf8
може зберігати лише символи з формату BMP. Це означає, що він не може зберігати емодзі або інші додаткові символи.
Загалом, рекомендується використовувати utf8mb4
для всіх нових додатків. Це гарантує, що ваші дані будуть збережені та оброблені правильно, незалежно від того, які символи вони містять.
Ще немає коментарів