MYSQL charset (кодировка)

Немного терминологии.

CHARACTER SET — это некий набор символов, называемых кодировкой. Разные CHARACTER SET включают в себя различные наборы символов. Различные CHARACTER SET могут включать примерно одинаковые наборы символов но в различном порядке (см. например koi8ru и cp1251). MySQL необходимо знать какой CHARACTER SET будет использован для данных в таблице, чтобы корректно проводить сортировку и индексацию данных.

COLLATION — способ, с помощью которого следует упорядочивать и сравнивать данные в БД.

Для одного и того же CHARACTER SET существует как правило несколько COLLATION. Например: cp1251_general_ci — сравнение не чувствительное к регистру, cp1251_bin — чувствительное к регистру.

Для того чтобы избежать проблем с кодировками нужно иметь представление о том, как для разных уровней иерархии СУБД их можно задать.

Способы задания кодировок

1) Для всего сервера при компиляции, определив параметры —with-charset и —with-collation:

./configure —with-charset=cp1251 —with-collation=cp1251_general_ci

2) Для всего сервера при запуске mysqld, определив параметры —character-set-server и —collation-server:

mysqld —character-set-server=cp1251 —collation-server=cp1251_bin

3) При создании БД:

CREATE DATABASE dbname DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;

4) При создании таблиц:

CREATE TABLE tblname ( col INT ) DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;

5) В определениях столбцов:

CREATE TABLE tblname ( column1 varchar(255), column2 varchar(255) CHARACTER SET cp1251 COLLATE cp1251_general_ci ) DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;

Для того чтобы посмотреть к какой кодировке привязана структура данных можно воспользоваться оператором SHOW CREATE:

mysql > SHOW CREATE TABLE tree_nodes;| tree_nodes | CREATE TABLE `tree_nodes` (…) ENGINE=InnoDB <b>DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin</b> |

Работа с клиентскими программами.

Любой mysql-клиент при соединении с сервером может установить несколько переменных:

character_set_client — указывает, в какой кодировке будут поступать данные от клиента;character_set_connection — указывает, в какую кодировку следует преобразовать данные полученые от клиента перед выполнением запроса;collation_connection — указывает, каким образом сравнивать между собой строки в запросах;character_set_results — указывает серверу на необходимость перекодировать результаты запроса в определенную кодировку перед выдачей их клиенту.

Для корректной работы клиента с сервером следует установить как минимум character_set_client, character_set_connection, character_set_results при помощи оператора SET:

mysql_query(«SET character_set_client=’cp1251′»);mysql_query(«SET character_set_connection=’cp1251′»);mysql_query(«SET character_set_results=’cp1251′»);

Если запрос и данные в БД находятся в одинаковой кодировке, а перекодировка результата не требуется, то вместо установки character_set_client, character_set_connection, character_set_results достаточно выполнить:

mysql_query(«SET NAMES ‘cp1251′»);

Для того чтобы посмотреть значения этих переменных установленные по умолчанию можно воспользоваться оператором SHOW VARIABLES:

SHOW VARIABLES LIKE ‘character_set%’;