Spec-Zone.ru › MySQL 5.7

10.3.6 Набор символов и сортировка строковых литералов

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

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

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

[_charset_name]'string' [COLLATE collation_name]

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

Примеры:

SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8'abc' COLLATE utf8_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;
    
  • Небинарная строка с набором символов utf8 и его сортировкой по умолчанию (т.е., utf8_general_ci):

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

    SELECT _binary'Müller';
    
  • Небинарная строка с набором символов по умолчанию для соединения и сортировкой utf8_general_ci (ошибка, если набор символов для соединения не utf8):

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

    SELECT 'Müller';
    

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

Следующие примеры показывают, что обработка экранирования происходит с использованием character_set_connection даже при наличии ввода. В примерах используется SET NAMES (который изменяет character_set_connection, как обсуждается в Разделе 10.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-5.7-en/charset-literal.html

Spec-Zone.ru

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