Spec-Zone .ru
спецификации, руководства, описания, API
|
У каждого литерала символьной строки есть набор символов и сопоставление.
У литерала символьной строки может быть дополнительный набор символов introducer и COLLATE
пункт:
[_charset_name
]'string
' [COLLATEcollation_name
]
Примеры:
SELECT 'string
';SELECT _latin1'string
';SELECT _latin1'string
' COLLATE latin1_danish_ci;
Для простого оператора SELECT '
, у
строки есть набор символов и сопоставление, определенное string
'character_set_connection
и collation_connection
системные переменные.
_
выражение формально вызывают
introducer. Это говорит синтаксический анализатор, "строка, которая собирается следовать за набором символов использования charset_name
X
." Поскольку это смутило людей в прошлом, мы
подчеркиваем, что introducer не изменяет строку на introducer набор символов как CONVERT()
сделал бы. Это не изменяет значение строки, хотя дополнение может
произойти. introducer является только сигналом. introducer является также законным перед стандартной
шестнадцатеричной литеральной и числовой шестнадцатеричной литеральной нотацией (x'
и literal
'0x
),
или перед нотацией литерала битового поля (nnnn
b'
и literal
'0b
). nnnn
Примеры:
SELECT _latin1 x'AABBCC';SELECT _latin1 0xAABBCC;SELECT _latin1 b'1100011';SELECT _latin1 0b1100011;
MySQL определяет набор символов литерала и сопоставление следующим способом:
Если оба _X
и COLLATE
определяются, набор символов Y
X
и сопоставление Y
используются.
Если _X
определяется, но COLLATE
не определяется, набор символов X
и его сопоставление значения по умолчанию используется.
Чтобы видеть сопоставление значения по умолчанию для каждого набора символов, используйте SHOW COLLATION
оператор.
Иначе, набор символов и сопоставление, данное character_set_connection
и collation_connection
системные переменные используются.
Примеры:
Строка с latin1
набор символов и latin1_german1_ci
сопоставление:
SELECT _latin1'Müller' COLLATE latin1_german1_ci;
Строка с latin1
набор символов и его сопоставление
значения по умолчанию (то есть, latin1_swedish_ci
):
SELECT _latin1'Müller';
Строка с набором символов значения по умолчанию соединения и сопоставлением:
SELECT 'Müller';
Набор символов 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.