Spec-Zone.ru › MySQL 9.2

12.3.6 Набор символов и сортировка строковой литералы

Каждая строковая литерала имеет набор символов и сортировку.

Для простого оператора SELECT 'string' строка имеет набор символов и сортировку по умолчанию для подключения, определяемые системными переменными character_set_connection и collation_connection.

Строковая литерала может иметь необязательный префикс набора символов и COLLATE-клаузу, чтобы указать, что она использует определённый набор символов и сортировку:

[_charset_name]'string' [COLLATE collation_name]

Выражение _charset_name формально называется префиксом. Оно сообщает анализатору: “следующая строка использует набор символов charset_name.” Префикс не изменяет строку на набор символов префикса, как это делала бы функция CONVERT(). Он не изменяет значение строки, хотя возможно добавление заполнения. Префикс является всего лишь сигналом. См. Раздел 12.3.8, «Префиксы наборов символов».

Примеры:

SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;

Префиксы наборов символов и COLLATE-клауза реализованы в соответствии со спецификациями стандарта SQL.

MySQL определяет набор символов и сортировку строковой литералы следующим образом:

  • Если указаны как _charset_name, так и COLLATE collation_name, используются набор символов charset_name и сортировка collation_name. collation_name должна быть разрешённой сортировкой для charset_name.

  • Если указан _charset_name, но не указана COLLATE, используется набор символов charset_name и его сортировка по умолчанию. Для просмотра сортировки по умолчанию для каждого набора символов используйте оператор SHOW CHARACTER SET или запросите таблицу INFORMATION_SCHEMA CHARACTER_SETS.

  • Если не указан _charset_name, но указана COLLATE collation_name, используется набор символов по умолчанию для подключения, заданный системной переменной character_set_connection, и сортировка collation_name. collation_name должна быть разрешённой сортировкой для набора символов по умолчанию для подключения.

  • В противном случае (ни _charset_name, ни COLLATE collation_name не указаны) используется набор символов по умолчанию для подключения и сортировка по умолчанию для подключения, заданные системными переменными character_set_connection и collation_connection.

Примеры:

  • Строка без бинарных данных с набором символов latin1 и сортировкой latin1_german1_ci:

    SELECT _latin1'Müller' COLLATE latin1_german1_ci;
    
  • Строка без бинарных данных с набором символов utf8mb4 и его сортировкой по умолчанию (то есть utf8mb4_0900_ai_ci):

    SELECT _utf8mb4'Müller';
    
  • Бинарная строка с набором символов binary и его сортировкой по умолчанию (то есть binary):

    SELECT _binary'Müller';
    
  • Строка без бинарных данных с набором символов по умолчанию для подключения и сортировкой utf8mb4_0900_ai_ci (ошибка, если набор символов подключения не utf8mb4):

    SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
    
  • Строка с набором символов по умолчанию для подключения и сортировкой по умолчанию для подключения:

    SELECT 'Müller';
    

Префикс указывает набор символов для следующей строки, но не изменяет, как анализатор обрабатывает экранирование в строке. Экранирование всегда интерпретируется анализатором в соответствии с набором символов, заданным переменной character_set_connection.

Следующие примеры показывают, что обработка экранирования происходит с использованием character_set_connection даже при наличии префикса. В примерах используется SET NAMES (который изменяет character_set_connection, как обсуждается в Разделе 12.4, «Наборы символов и сортировки подключения»), и результаты отображаются с помощью функции HEX(), чтобы можно было увидеть точное содержимое строки.

Пример 1:

mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n')  | HEX(_sjis'à\n')  |
+------------+-----------------+
| E00A       | E00A            |
+------------+-----------------+

Здесь à (шестнадцатеричное значение E0) следует за \n, последовательность экранирования новой строки. Последовательность экранирования интерпретируется с использованием значения character_set_connection latin1 для получения литеральной новой строки (шестнадцатеричное значение 0A). Это происходит даже для второй строки. То есть, префикс _sjis не влияет на обработку экранирования анализатором.

Пример 2:

mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n')  | HEX(_latin1'à\n')  |
+------------+-------------------+
| E05C6E     | E05C6E            |
+------------+-------------------+

Здесь character_set_connection имеет значение sjis, набор символов, в котором последовательность à, за которой следует \ (шестнадцатеричные значения 05 и 5C) является допустимым многобайтовым символом. Таким образом, первые два байта строки интерпретируются как один символ sjis, а \ не интерпретируется как символ экранирования. Следующее n (шестнадцатеричное значение 6E) не интерпретируется как часть последовательности экранирования. Это верно и для второй строки; префикс _latin1 не влияет на обработку экранирования.

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

Spec-Zone.ru

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