utf8 vs utf8mb4, что использовать?

При поддержке сайтов мне периодически попадается на глаза устаревшая кодировка utf8 в MySql. Об этой теме сказано уже много, но utf8 продолжает встречаться и в новых проектах, хотя пора переходить на utf8mb4.

Не буду тянуть кота за хвост и сразу отвечу на вопрос в заголовке, используйте utf8mb4 для MySql. Это избавит вас от проблем при работе с 4-х байтными символами. Кодировка utf8 является псевдонимом 3-х байтовой кодировки utf8mb3, поэтому MySql выдает ошибки когда встречает непонятные для себя символы в строке.

Пример ошибки:

Incorrect string VALUE: '\xF6\x3F\x98\x41...' FOR COLUMN 'data' at ROW 1

Через некоторое время разработчики MySql сделают utf8 псевдонимом utf8mb4. Так будет удобнее пользователям этой СУБД, но на данный момент необходимо указывать значение utf8mb4 вручную.

Пример создания таблицы с utf8mb4:

CREATE TABLE `example_table`
(
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    example_field VARCHAR(255) NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE=InnoDB;

Настройка кодировки всей базы данных:

ALTER DATABASE your_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Обновление кодировки для одной таблицы:

ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Отображение подробной информации о таблица, столбцах и кодировках:

SELECT TABLE_SCHEMA,
       TABLE_NAME,
       CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET,
       COLUMN_NAME,
       COLUMN_TYPE,
       C.CHARACTER_SET_NAME
FROM information_schema.TABLES AS T
         JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME)
         JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA
              ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME)
WHERE TABLE_SCHEMA = SCHEMA()
ORDER BY TABLE_SCHEMA,
         TABLE_NAME,
         COLUMN_NAME;

Полезные ссылки

11.03.2022

Категория(-и): Базы данных

#

Добавить комментарий