При поддержке сайтов мне периодически попадается на глаза устаревшая кодировка 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;
Полезные ссылки
- stackoverflow.com/questions/1049728/how-do-i-see-what-character-set-a-mysql-database-table-column-is
- dev.mysql.com/doc/refman/8.0/en/charset-database.html
- stackoverflow.com/questions/30074492/what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysql
- eversql.com/mysql-utf8-vs-utf8mb4-whats-the-difference-between-utf8-and-utf8mb4
- profiphp.ru/useful/utf8mb4.html
- andreyex.ru/bazy-dannyx/baza-dannyx-mysql/mysql-utf8-protiv-utf8mb4-v-chem-raznitsa-mezhdu-utf8-i-utf8mb4
- dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html
- dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.