10.3.6 Набор символов и сортировка строковых литералов
Каждый строковой литерал имеет набор символов и сортировку.
Для простого оператора SELECT
' строка имеет набор символов и сортировку по умолчанию для соединения, определенные переменными сервера string'character_set_connection и collation_connection.
Строковой литерал может иметь необязательный ввод набора символов и COLLATE, чтобы указать его как строку, использующую определенный набор символов и сортировку:
[_charset_name]'string' [COLLATE collation_name]
Выражение _ формально называется вводом. Оно сообщает парсеру: “строка, которая следует за ним, использует набор символов charset_namecharset_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_namecharset_nameи сортировкаcollation_name.collation_nameдолжна быть допустимой сортировкой дляcharset_name.Если указан
_charset_name, ноCOLLATEне указан, используются набор символовcharset_nameи его сортировка по умолчанию. Чтобы увидеть сортировку по умолчанию для каждого набора символов, используйте операторSHOW CHARACTER SETили запросите таблицуINFORMATION_SCHEMACHARACTER_SETS.Если
_charset_nameне указан, ноCOLLATEуказан, используется набор символов по умолчанию для соединения, заданный переменной сервераcollation_namecharacter_set_connection, и сортировкаcollation_name.collation_nameдолжна быть допустимой сортировкой для набора символов по умолчанию для соединения.В противном случае (ни
_charset_name, ниCOLLATEне указаны), используются набор символов и сортировка по умолчанию для соединения, заданные переменными сервераcollation_namecharacter_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.