ProfiPHPProfiPHP
Категория: Полезное в PHP

Кодировка Utf8mb4 в MySQL

В MySQL кодировка utf8 использует максимум 3 байта на символ и включает только BMP (основная многоязычная плоскость (0000—FFFF) символы. Но этого иногда бывает недостаточно, поскольку сегодня существуют символы, которые занимают более 3 байт. Например символы таблицы Unicode Emoji. Для решения проблем из сохранением символов, начиная с версии MySQL 5.5.3 появилась кодировка utf8mb4, которая использует максимум 4 байта на символ и поддерживает дополнительные символы. BMP символы utf8 и utf8mb4 имеют одинаковые характеристики хранения: одинаковый код, одинаковое кодирование, одинаковую длину. При переходе на более позднюю версию MySQL можно не беспокоится о потере данных в столбцах, поскольку кодировка utf8 не может хранить все символы.
Incorrect string value: \xF0\x9F\x91\x8A\xD0\xA7...
У вас данная ошибка? Вот вы и знаете причину потери информации при сохранении в кодировке utf8, которая не сохраняла символы, не помещающиеся в 3 байта.

Для устранения ошибки необходимо сделать несколько изменений. Но прежде всего необходимо проверить версию базы данных. Для этого выполняем код:
$mysqli = new mysqli( "host", "username", "password");
echo mysqli_get_server_info ( $mysqli );
Если версии ниже 5.5.3, необходимо обновить версию MySQL сервера.
Обязательно создайте резервные копии всех баз данных!

Начнем с кодировки базы данных:
ALTER DATABASE <database> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Следующим действием необходимо изменить кодировки таблицы:
ALTER TABLE <database>.<table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Столбцы типа данных TEXT изменяются на MEDIUMTEXT, а столбцы MEDIUMTEXT заменяются на LONGTEXT.

Также можно изменять кодировки отдельных столбцов:
ALTER TABLE <database>.<table_name> MODIFY <column_name> TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Кодировка utf8mb4 использует 4 байта на символ, вместо 3 как было в uft8. Но при конвертации длина в байтах для столбца или индекса остается неизменной. Например, тип TEXT может сохранить 64КБ. Если каждый символ хранит 3 байта, в данный тип может поместиться 21845 трехбайтных символов. Соответственно, если каждый символ занимает 4 байта, максимально допустимо 16383 четырехбайтных символа. Из этого следует что вы не сможете записать в данное поле больше 16383 символов после конвертации. Если вам нужно хранить большее количество символов, необходимо изменить тип поля на MEDIUMTEXT.

Также в конфигурационных настройках сервера измените следующие настройки:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

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

Имя:
Текст комментария: