Кодировка и представление
Код MySQL, как и любая другая информация в вычислительной технике, задается с помощью сочетания единицы и нуля, которые образуют биты. Это ведь основы информатики, которые все мы проходили в школе.
В мире существует множество текстовых кодировок (сочетаний 0 и 1), но в современности все они более-менее стандартизированы. Хотя и сейчас можно наткнуться на «абракадабру», если неправильно задать кодировку.
На данном этапе развития всемирной паутины самыми распространенными являются 3 типа кодировок:
Юникод
ASCII
EBCDIC
Для нас самой главной кодировкой базы данных MySQL является UTF-8
. Это значит, что в ней используется 8-битный Юникод для представления всех символов. Благодаря широкой поддержке данной кодировки в Сети и на прикладном уровне вы можете быть уверены, что записи в базе будут сохранены в читаемом виде без «абракадабр».
Символьная кодировка может быть задана для:
- Сервера
- Базы данных
- Таблицы
- Колонок в таблице
Все параметры могут быть переданы серверу тремя разными способами:
- Через командную строку
mysqld
- Через конфигурационный файл
my.cnf
my.ini
- Через опции компиляции
Кодировка character set и представление collation сервера
Кодировка characher set
это набор используемых символов, на картинки это utf8
.
Представление collation
набор правил для сравнения символов в наборе, на картинки это utf8_general_ci
.
Тут есть несколько фундаментальных вещей которые надо понимать. Основные параметры используемые в контексте сервера:
character_set_server
collation_server
Оба параметра влияют на определение кодировки и отображения сервера MySQL. Можно задать оба параметра либо только один из них. При этом важно знать как задача того или иного влияет на определение отсутствующего:
Не заданы
используются значения по умолчанию (дефолтные)Заданы оба
используются указанные кодировка и ее представлениеЗадана только кодировка
представление выставляется по умолчанию для данного типа кодировки. Для каждого типа кодировки есть ее дефолтное представление, например, дефолтная кодировка сервераlatin1
, дефолтное отображение для нееlatin1_swedish_ci
Кодировка (character set) и представление (collation) сервера
Посмотреть соответствие кодировки и ее дефолтного представления можно используя команду:
mysql>SHOW COLLATION LIKE 'имя_набора_характеристик';
mysql>SHOW COLLATION LIKE 'latin1%';
mysql> +-------------------+---------+----+---------+----------+---------+
| 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 |
+-------------------+---------+----+---------+----------+---------+
Поле Default
дает ответ о представлении выбранной кодировки.
Наши команды для установки кодировки:
my.cnf (my.ini)[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
Кодировка (character set) и представление (collation) базы данных
Тут есть два варианта определения кодировки и представления.
Явно
при выполнении запроса на создание базы данных:
mysql>CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
Неявно
через переменные character_set_database
и collation_database
. Однако, эти переменные нельзя задать явно ни в командной строке ни в конфигурационном файле.
Кодировка (character set) и представление (collation) таблиц
Тут все довольно просто. Задать кодировку и ее представление можно через команды:
mysql>CREATE TABLE t1 ( … )
mysql>CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Тут главное иметь в виду, что если эти настройки не заданы, то берутся настройки базы данных.
Кодировка (character set) и представление (collation) колонок в таблице
Если параметры кодировок не указаны, берутся те, что указывались для таблицы.
Кодировка клиент-серверного соединения
Вообще при работе с базой данных огромную роль помимо серверных настроек играют настройки клиент-серверного соединения connection
. На этом этапе вступают в игру следующие специфичные для соединения параметры:
character_set_client
кодировка в которой посылается запрос от клиентаcharacter_set_connection
кодировка используемая для конвертации пришедшего запросаstatement'а
character_set_results
кодировку, в которую сервер должен перевести результат перед его отправкой клиентуcolation_connection
представление кодировки соединения
Озадачиваться проблемой инициализации всех этих переменных не стоит (хотя в нашем случае присвоить им значения необходимо).