Поиск

Наборы символов и порядки сопоставления на уровне соединения

Некоторые переменные набора символов и порядка сопоставления имеют отношение к взаимодействию клиента с сервером. О части из них уже упоминались в предыдущих разделах:

  1. Серверный набор символов и порядок сопоставления доступны через системные
    переменные character_set_server и collation server.
  2. Набор символов и порядок сопоставления базы данных по умолчанию доступны
    через системные переменные character_set_database и collation_database.

Дополнительные символьные наборы и порядки сопоставления включаются в управ­ление трафиком соединения клиента и сервера. Каждый клиент имеет набор символов и порядок сопоставления, связанные с соединением.
Рассмотрим, что такое соединение. Соединение - это то, что вы получаете при подключении к серверу. Клиент посылает SQL-операторы, подобные запросам, через соединение серверу. Сервер клиенту отправляет ответы, такие как результирующие на­боры, по тому же соединению. Это вызывает некоторые вопросы об управлении сим­вольным набором и порядком сопоставления для клиентских соединений, на каждый из которых можно ответить в терминах системных переменных:

  • Какой набор символов имеет запрос, когда он покидает клиента?
    Сервер берет переменную character_set_client в качестве набора символов принимаемых от клиента запросов.
    м В какой набор символов должен сервер транслировать запрос после его получения? Для этого сервер использует переменные character_set_connection и collation_connection. Он преобразует отправленные клиентом запросы из набо­ра character_set_client в character_set_connection (за исключением стро­ковых литералов, представленных как _latinl или _utf8). Переменная collation_connection важна для сравнения литеральных строк. Для сравнения строк со значениями столбцов это не имеет значения, поскольку порядок сопос­тавления столбцов имеет более высокий приоритет.

  • В какой символьный набор должен сервер транслировать результирующий набор или сообщение об ошибке перед отправкой их клиенту?

Переменная charactersetresuits задает символьный набор, в котором сервер возвращает результаты клиенту. Это включает в себя результирующие данные, та­кие как значения столбцов и метаданные результата, подобные именам столбцов.
Вы можете осуществить тонкую настройку установок этих переменных либо поло­житься на умолчания (в этом случае можно пропустить настоящий раздел). Существуют два оператора, влияющие на набор символов соединения:
SET NAMES 'имя__набора_символов'
SET CHARACTER SET имя_набора_ символов
SET NAMES задает ожидаемый набор символов, в котором клиент будет отправлять SQL-операторы. То есть, SET NAMES 'cpl251' сообщает серверу, что входящие сообще­ния от этого клиента будут в наборе символов ср1251. Это также определяет набор символов для результатов, которые сервер будет отправлять обратно клиенту. (Например, подобным образом задается набор символов для значений столбцов, возвращаемых оператором SELECT.)
Оператор SET NAMES 'x' эквивалентен следующим трем операторам:
mysqlSET characteriset_client = x; mysqlSET character_set_results = x; mysqlSET character_set_connection = x;
Установка значения character_set_connection в х также устанавливает значение collation__connection равным collation по умолчанию для х.
SET CHARACTER SET похож, однако устанавливает набор символов и порядок сопос­тавления для соединения такими же, как у базы данных по умолчанию. Оператор SET CHARACTER SET xэквивалентен следующим трем операторам:
mysqlSET characterise t_cl ient » x;
mysqlSET character__se t_re sults = x;
mysqlSET collationjsonnection » @@collationjiatabase;
Когда клиент подключается, он посылает серверу имя символьного набора, который желает использовать. Сервер устанавливает в переменных character set client, character_set_results и character_set__connection имя этого символьного набора. (В сущности, сервер выполняет операцию SET NAMES, используя этот набор.)
При работе с клиентской программой mysql нет необходимости выполнять SET NAMES каждый раз в начале работы, если вы хотите установить набор символов, отличный от принятого по умолчанию. Вы можете добавить опцию —-default-character-set в ко­мандную строку вызова mysql либо в файл опций. Например, следующие установки файла опций изменяют значение трех переменных символьного набора на koi8r при каждом запуске mysql:
[mysql] default-character-set=koi8r
Рассмотрим пример. Предположим, что столбец columnl определен как CHAR(5) CHARACTER SET Iatin2.
Если вы не выполняете SET NAMES или SET CHARACTER SET, то, выполнив SELECT columnl FROM t, сервер отправит обратно все значения columnl, используя символьный набор, указанный при подключении. С другой стороны, если вы установите SET NAMES 1 latinl' или SET CHARACTER SET latinl, то непосредственно перед отправкой результа­та сервер будет преобразовывать значения, представленные в Iatin2, в latinl. Преобра­зование может привести к потерям, если в одном наборе окажутся символы, отсутст­вующие в другом наборе.
Если вы не хотите, чтобы сервер выполнял какие-то преобразования, установите character_set resilts в NULL:
mysqlSET character_set_results = NULL;