Spec-Zone .ru
спецификации, руководства, описания, API

10.1.3.5. Набор символов Литерала Символьной строки и Сопоставление

У каждого литерала символьной строки есть набор символов и сопоставление.

У литерала символьной строки может быть дополнительный набор символов introducer и COLLATE пункт:

[_charset_name]'string' [COLLATE collation_name]

Примеры:

SELECT 'string';SELECT _latin1'string';SELECT _latin1'string' COLLATE latin1_danish_ci;

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

_charset_name выражение формально вызывают introducer. Это говорит синтаксический анализатор, "строка, которая собирается следовать за набором символов использования X." Поскольку это смутило людей в прошлом, мы подчеркиваем, что introducer не изменяет строку на introducer набор символов как CONVERT() сделал бы. Это не изменяет значение строки, хотя дополнение может произойти. introducer является только сигналом. introducer является также законным перед стандартной шестнадцатеричной литеральной и числовой шестнадцатеричной литеральной нотацией (x'literal' и 0xnnnn), или перед нотацией литерала битового поля (b'literal' и 0bnnnn).

Примеры:

SELECT _latin1 x'AABBCC';SELECT _latin1 0xAABBCC;SELECT _latin1 b'1100011';SELECT _latin1 0b1100011;

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

Примеры:

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

introducer указывает на набор символов для следующей строки, но не изменяется теперь, как синтаксический анализатор выполняет обработку escape в пределах строки. Escape всегда интерпретируются синтаксическим анализатором согласно набору символов, данному character_set_connection.

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

Пример 1:

mysql> SET NAMES latin1;Query OK, 0 rows affected (0.01 sec)mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');+------------+-----------------+| HEX('à\n') | HEX(_sjis'à\n') |+------------+-----------------+| E00A       | E00A            |+------------+-----------------+1 row in set (0.00 sec)

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

Пример 2:

mysql> SET NAMES sjis;Query OK, 0 rows affected (0.00 sec)mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');+------------+-------------------+| HEX('à\n') | HEX(_latin1'à\n') |+------------+-------------------+| E05C6E     | E05C6E            |+------------+-------------------+1 row in set (0.04 sec)

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