Можливості utf8mb4 в MySQL 8.0: розкриття повного потенціалу багатомовних даних

Можливості utf8mb4 в MySQL 8.0: розкриття повного потенціалу багатомовних даних
Переклад 11 хв. читання
29 серпня 2023

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

Джерело: The Power of utf8mb4 in MySQL 8.0: Unleashing the Full Potential of Multilingual Data
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація