Кодировка и представление
Код MySQL, как и любая другая информация в вычислительной технике, задается с помощью сочетания единицы и нуля, которые образуют биты. Это ведь основы информатики, которые все мы проходили в школе.
В мире существует множество текстовых кодировок (сочетаний 0 и 1), но в современности все они более-менее стандартизированы. Хотя и сейчас можно наткнуться на «абракадабру», если неправильно задать кодировку.
На данном этапе развития всемирной паутины самыми распространенными являются 3 типа кодировок:
ЮникодASCIIEBCDIC
Для нас самой главной кодировкой базы данных MySQL является UTF-8. Это значит, что в ней используется 8-битный Юникод для представления всех символов. Благодаря широкой поддержке данной кодировки в Сети и на прикладном уровне вы можете быть уверены, что записи в базе будут сохранены в читаемом виде без «абракадабр».
Символьная кодировка может быть задана для:
- Сервера
- Базы данных
- Таблицы
- Колонок в таблице
Все параметры могут быть переданы серверу тремя разными способами:
- Через командную строку
mysqld - Через конфигурационный файл
my.cnfmy.ini - Через опции компиляции
Что такое кодировка character set и представление collation
Кодировка characher set это набор используемых символов, на картинки это utf8.
Представление collation набор правил для сравнения символов в наборе, на картинки это utf8_general_ci.
Тут есть несколько фундаментальных вещей которые надо понимать. Основные параметры используемые в контексте сервера:
character_set_servercollation_server
Оба параметра влияют на определение кодировки и отображения сервера MySQL. Можно задать оба параметра либо только один из них. При этом важно знать как задача того или иного влияет на определение отсутствующего:
Не заданыиспользуются значения по умолчанию (дефолтные)Заданы обаиспользуются указанные кодировка и ее представлениеЗадана только кодировкапредставление выставляется по умолчанию для данного типа кодировки. Для каждого типа кодировки есть ее дефолтное представление, например, дефолтная кодировка сервераlatin1, дефолтное отображение для нееlatin1_swedish_ci
Сервер — кодировка (character set) и представление (collation)
Посмотреть соответствие кодировки и ее дефолтного представления можно используя команду:
mysql>SHOW COLLATION LIKE 'имя_набора_характеристик';
mysql>SHOW COLLATION LIKE 'latin1%';
Поле Default дает ответ о представлении выбранной кодировки:
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | Yes | 1 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | Yes | 1 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | Yes | 1 |
| latin1_general_cs | latin1 | 49 | | Yes | 1 |
| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |
+-------------------+---------+----+---------+----------+---------+
База данных — кодировка (character set) и представление (collation)
Чтобы быстро определить кодировку вашей базы данных MySQL, выполните команду:
mysql>SHOW VARIABLES LIKE 'character_set_database';
Кодировку и представление можно указать в процессе создания базы данных:
mysql>CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
Таблица — кодировка (character set) и представление (collation)
Чтобы быстро определить кодировку вашей таблицы MySQL, выполните команду:
mysql>SHOW TABLE STATUS WHERE Name = 'table_name';
Задать кодировку и ее представление можно через команды:
mysql>CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Если эти настройки не заданы, то берутся настройки базы данных.
Колонки — кодировка (character set) и представление (collation)
Чтобы быстро определить кодировку вашей колонки в таблице MySQL, выполните команду:
mysql>SHOW FULL COLUMNS FROM 'table_name' WHERE Field = 'column_name';
Если эти настройки не заданы, то берутся настройки для таблицы.
Кодировка клиент-серверного соединения
При работе с базой данных огромную роль помимо серверных настроек играют настройки клиент-серверного соединения connection. На этом этапе вступают в игру следующие специфичные для соединения параметры:
character_set_clientкодировка в которой посылается запрос от клиентаcharacter_set_connectionкодировка используемая для конвертации пришедшего запросаstatement'аcharacter_set_resultsкодировку, в которую сервер должен перевести результат перед его отправкой клиентуcolation_connectionпредставление кодировки соединения
Получить массовый SQL запросы на изменение таблиц
Для изменения кодировки и collation всех таблиц в базе данных можно использовать SQL-запросы. Например, чтобы изменить кодировку всех таблиц базы данных на utf8mb4 с представлением utf8mb4_general_ci, нужно выполнить следующий запрос:
mysql>SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') as sqlcode
FROM `information_schema`.`TABLES` t
WHERE 1 AND t.`TABLE_SCHEMA` = 'table_name'
ORDER BY 1;
Замените table_name на название вашей базы данных. Этот запрос сгенерирует список SQL-запросов ALTER TABLE, которые нужно выполнить для изменения кодировки и представлений всех таблиц.
