Spec-Zone.ru › MySQL 9.2

12.4 Наборы символов и сортировки соединений

«Соединение» — это то, что программа-клиент устанавливает при подключении к серверу для начала сессии, в рамках которой она взаимодействует с сервером. Клиент отправляет SQL-запросы, такие как запросы, по соединению сессии. Сервер отправляет ответы, такие как наборы результатов или сообщения об ошибках, по соединению обратно клиенту.

  • Переменные системы набора символов и сортировки соединения

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

  • Настройка набора символов соединения программы-клиента

  • SQL-запросы для настройки набора символов соединения

  • Обработка ошибок набора символов соединения

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

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

  • Переменные системы character_set_server и collation_server указывают на набор символов и сортировку сервера. См. Раздел 12.3.2, «Набор символов и сортировка сервера».

  • Переменные системы character_set_database и collation_database указывают на набор символов и сортировку по умолчанию базы данных. См. Раздел 12.3.3, «Набор символов и сортировка базы данных».

Дополнительные переменные системы набора символов и сортировки участвуют в обработке трафика для соединения между клиентом и сервером. Каждый клиент имеет специфичные для сессии переменные системы набора символов и сортировки соединения. Значения этих переменных системы инициализируются во время подключения, но могут быть изменены в рамках сессии.

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

  • В каком наборе символов находятся инструкции при выходе из клиента?

    Сервер принимает переменную системы character_set_client в качестве набора символов, в котором клиент отправляет инструкции.

    Примечание

    Некоторые наборы символов не могут быть использованы в качестве набора символов клиента. См. Недопустимые наборы символов клиента.

  • В какой набор символов должен перевести сервер инструкции после их получения?

    Для определения этого сервер использует переменные системы character_set_connection и collation_connection:

    • Сервер преобразует инструкции, отправленные клиентом, из character_set_client в character_set_connection. Исключение: для строковых литералов, имеющих префикс, например, _utf8mb4 или _latin2, набор символов определяется префиксом. См. Раздел 12.3.8, «Префиксы набора символов».

    • collation_connection имеет значение для сравнения строковых литералов. Для сравнения строк со значениями столбцов collation_connection не имеет значения, так как столбцы имеют свою сортировку, имеющую более высокий приоритет (см. Раздел 12.8.4, «Сводимость сортировок в выражениях»).

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

    Переменная системы character_set_results указывает на набор символов, в котором сервер возвращает результаты запроса клиенту. Это включает данные результатов, такие как значения столбцов, метаданные результатов, такие как имена столбцов, и сообщения об ошибках.

    Чтобы указать серверу не выполнять преобразование наборов символов для наборов результатов или сообщений об ошибках, задайте character_set_results равным NULL или binary:

    SET character_set_results = NULL;
    SET character_set_results = binary;
    

    Дополнительную информацию о наборах символов и сообщениях об ошибках см. в Разделе 12.6, «Набор символов сообщений об ошибках».

Чтобы увидеть значения переменных системы набора символов и сортировки, применимые к текущей сессии, используйте следующую инструкцию:

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;

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

SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';

Клиенты могут настроить параметры этих переменных или использовать значения по умолчанию (в этом случае вы можете пропустить остальную часть этого раздела). Если вы не используете значения по умолчанию, вам необходимо изменить параметры набора символов для каждого подключения к серверу.

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

Переменная системы character_set_client не может быть установлена на некоторые наборы символов:

ucs2
utf16
utf16le
utf32

Попытка использовать любой из этих наборов символов в качестве набора символов клиента приводит к ошибке:

mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'

Та же ошибка возникает, если любой из этих наборов символов используется в следующих контекстах, все из которых приводят к попытке установить character_set_client на указанный набор символов:

  • Опция команды --default-character-set=charset_name, используемая программами-клиентами MySQL, такими как mysql и mysqladmin.

  • Инструкция SET NAMES 'charset_name'.

  • Инструкция SET CHARACTER SET 'charset_name'.

END_OF_DOCUMENT_MARKER

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

При подключении клиента к серверу клиент указывает кодировку, которую он хочет использовать для связи с сервером. (Фактически клиент указывает значение по умолчанию для этой кодировки, по которому сервер может определить кодировку.) Сервер использует эту информацию для установки системных переменных character_set_client, character_set_results, character_set_connection на кодировку, а collation_connection на кодировку по умолчанию. По сути, сервер выполняет операцию, эквивалентную SET NAMES.

Если сервер не поддерживает запрошенную кодировку или кодировку сортировки, он использует кодировку и кодировку сортировки сервера для настройки соединения. Дополнительные сведения об этом поведении по умолчанию см. в разделе Обработка ошибок кодировки соединения.

Клиентские программы mysql, mysqladmin, mysqlcheck, mysqlimport и mysqlshow определяют используемую кодировку по умолчанию следующим образом:

  • В отсутствии другой информации каждый клиент использует кодировку по умолчанию, скомпилированную в программу, обычно utf8mb4.

  • Каждый клиент может автоматически определить используемую кодировку на основе настроек операционной системы, например, значения переменной среды LANG или LC_ALL locale на Unix-системах или настройки кодовой страницы на системах Windows. Для систем, на которых локаль доступна из ОС, клиент использует её для установки кодировки по умолчанию вместо использования скомпилированной по умолчанию. Например, установка LANG на ru_RU.KOI8-R приводит к использованию кодировки koi8r. Таким образом, пользователи могут настроить локаль в своей среде для использования MySQL-клиентами.

    Кодировка ОС сопоставляется с ближайшей кодировкой MySQL, если точного соответствия нет. Если клиент не поддерживает соответствующую кодировку, он использует кодировку по умолчанию, скомпилированную в программу. Например, utf8 и utf-8 сопоставляются с utf8mb4, а ucs2 не поддерживается в качестве кодировки соединения, поэтому она сопоставляется со значением по умолчанию, скомпилированным в программе.

    Приложения на языке C могут использовать автоматическое определение кодировки на основе настроек ОС, вызвав следующим образом перед подключением к серверу:

    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    
  • Каждый клиент поддерживает опцию --default-character-set, которая позволяет пользователям явно указать кодировку, чтобы переопределить любое значение по умолчанию, которое клиент определяет иначе.

    Примечание

    Некоторые кодировки не могут быть использованы в качестве кодировки клиента. Попытка их использования с помощью --default-character-set приводит к ошибке. См. Недопустимые кодировки клиента.

С клиентом mysql для использования кодировки, отличной от кодировки по умолчанию, вы можете явно выполнить оператор SET NAMES каждый раз при подключении к серверу (см. Настройка кодировки соединения клиентской программы). Для достижения той же цели более простым способом укажите кодировку в файле параметров. Например, следующая настройка файла параметров изменяет три системные переменные кодировки, связанные с подключением, на koi8r каждый раз, когда вы запускаете mysql:

[mysql]
default-character-set=koi8r

Если вы используете клиент mysql с включенным автоматическим подключением (чего не рекомендуется делать), предпочтительнее использовать команду charset вместо SET NAMES. Например:

mysql> charset koi8r
Charset changed

Команда charset выполняет оператор SET NAMES и также изменяет кодировку по умолчанию, которую mysql использует при повторном подключении после разрыва соединения.

При настройке клиентских программ также необходимо учитывать среду, в которой они выполняются. См. Раздел 12.5, «Настройка кодировки и кодировки сортировки приложения».

SQL-запросы для настройки кодовой страницы соединения

После установления соединения клиенты могут изменить переменные кодовой страницы и правила сортировки для текущей сессии. Эти переменные могут быть изменены по отдельности с помощью запросов SET, но есть два более удобных запроса, которые влияют на переменные кодовой страницы, связанные с соединением, как единый блок:

  • SET NAMES 'charset_name' [COLLATE 'collation_name']

    Запрос SET NAMES указывает кодовую страницу, которую использует клиент для отправки SQL-запросов на сервер. Таким образом, SET NAMES 'cp1251' сообщает серверу: “будущие входящие сообщения от этого клиента находятся в кодовой странице cp1251.” Он также определяет кодовую страницу, которую сервер должен использовать для отправки результатов обратно клиенту. (Например, он указывает кодовую страницу, которую нужно использовать для значений столбцов, если вы используете запрос SELECT, который генерирует результат.)

    Запрос SET NAMES 'charset_name' эквивалентен этим трём запросам:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET character_set_connection = charset_name;
    

    Установка character_set_connection в charset_name также неявно устанавливает collation_connection в значение по умолчанию для charset_name. Нет необходимости явно устанавливать это правило сортировки. Чтобы указать конкретное правило сортировки для collation_connection, добавьте COLLATE-оператор:

    SET NAMES 'charset_name' COLLATE 'collation_name'
    
  • SET CHARACTER SET 'charset_name

    SET CHARACTER SET похож на SET NAMES, но устанавливает character_set_connection и collation_connection на значения character_set_database и collation_database (которые, как упоминалось ранее, указывают кодовую страницу и правило сортировки базы данных по умолчанию).

    Запрос SET CHARACTER SET charset_name эквивалентен этим трём запросам:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET collation_connection = @@collation_database;
    

    Установка collation_connection также неявно устанавливает character_set_connection на кодовую страницу, связанную с правилом сортировки (эквивалентно выполнению SET character_set_connection = @@character_set_database). Нет необходимости явно устанавливать character_set_connection.

Примечание

Некоторые кодовые страницы не могут быть использованы в качестве кодовой страницы клиента. Попытка их использования с запросом SET NAMES или SET CHARACTER SET приведёт к ошибке. См. Недопустимые кодовые страницы клиента.

Пример: Предположим, что column1 определена как CHAR(5) CHARACTER SET latin2. Если вы не используете SET NAMES или SET CHARACTER SET, то для SELECT column1 FROM t сервер возвращает все значения для column1, используя кодовую страницу, указанную клиентом при подключении. С другой стороны, если вы используете SET NAMES 'latin1' или SET CHARACTER SET 'latin1' перед выполнением запроса SELECT, сервер преобразует значения latin2 в latin1 непосредственно перед отправкой результатов. Преобразование может быть неполным для символов, отсутствующих в обеих кодовых страницах.

Обработка ошибок кодовой страницы соединения

Попытки использовать несоответствующую кодовую страницу или правило сортировки соединения могут привести к ошибке или заставить сервер вернуться к кодовой странице и правилу сортировки по умолчанию для данного соединения. Этот раздел описывает проблемы, которые могут возникнуть при конфигурации кодовой страницы соединения. Эти проблемы могут возникать при установлении соединения или при изменении кодовой страницы в рамках уже установленного соединения.

  • Обработка ошибок во время подключения

  • Обработка ошибок во время выполнения

Обработка ошибок при подключении

Некоторые кодовые страницы не могут быть использованы в качестве кодовой страницы клиента; см. Недопустимые кодовые страницы клиента. Если вы укажете кодовую страницу, которая допустима, но не разрешена в качестве кодовой страницы клиента, сервер вернёт ошибку:

$> mysql --default-character-set=ucs2
ERROR 1231 (42000): Variable 'character_set_client' can't be set to
the value of 'ucs2'

Если вы укажете кодовую страницу, которую клиент не распознаёт, будет возвращена ошибка:

$> mysql --default-character-set=bogus
mysql: Character set 'bogus' is not a compiled character set and is
not specified in the '/usr/local/mysql/share/charsets/Index.xml' file
ERROR 2019 (HY000): Can't initialize character set bogus
(path: /usr/local/mysql/share/charsets/)

Если вы укажете кодовую страницу, которую распознаёт клиент, но не распознаёт сервер, сервер вернётся к своей кодовой странице и правилу сортировки по умолчанию. Предположим, что сервер настроен на использование latin1 и latin1_swedish_ci в качестве значений по умолчанию и не распознаёт gb18030 как допустимую кодовую страницу. Клиент, который указывает --default-character-set=gb18030, сможет подключиться к серверу, но полученная кодовая страница не будет той, что хотел клиент:

mysql> SHOW SESSION VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 |
| character_set_connection | latin1 |
...
| character_set_results    | latin1 |
...
+--------------------------+--------+
mysql> SHOW SESSION VARIABLES LIKE 'collation_connection';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
+----------------------+-------------------+

Вы можете видеть, что переменные системы соединения установлены так, чтобы отразить кодовую страницу и правило сортировки latin1 и latin1_swedish_ci. Это происходит потому, что сервер не может выполнить запрос клиента на кодовую страницу и возвращается к значениям по умолчанию.

В этом случае клиент не может использовать желаемую кодовую страницу, так как сервер её не поддерживает. Клиент должен либо согласиться использовать другую кодовую страницу, либо подключиться к другому серверу, который поддерживает желаемую кодовую страницу.

Та же проблема возникает, когда клиент сообщает серверу использовать кодовую страницу, которую распознает сервер, но правило сортировки по умолчанию для этой кодовой страницы на стороне клиента неизвестно на стороне сервера.

Обработка ошибок во время выполнения

В рамках установленного соединения клиент может запросить изменение кодовой страницы и правила сортировки соединения с помощью SET NAMES или SET CHARACTER SET.

Некоторые кодовые страницы не могут быть использованы в качестве кодовой страницы клиента; см. Недопустимые кодовые страницы клиента. Если вы укажете кодовую страницу, которая допустима, но не разрешена в качестве кодовой страницы клиента, сервер вернёт ошибку:

mysql> SET NAMES 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client' can't be set to
the value of 'ucs2'

Если сервер не распознаёт кодовую страницу (или правило сортировки), он вернёт ошибку:

mysql> SET NAMES 'bogus';
ERROR 1115 (42000): Unknown character set: 'bogus'

mysql> SET NAMES 'utf8mb4' COLLATE 'bogus';
ERROR 1273 (HY000): Unknown collation: 'bogus'
Подсказка

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

SELECT @@character_set_client;

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/charset-connection.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API