12.3.8 Вводные наборы символов
Литерал строкового значения, шестнадцатеричного значения или значения бита может иметь необязательный вводный набор символов и COLLATE предложение, чтобы обозначить его как строку, использующую определённый набор символов и сортировку:
[_charset_name] literal [COLLATE collation_name]
Выражение _ формально называется вводным набором. Оно сообщает парсеру: “следующая строка использует набор символов charset_namecharset_name.” Вводный набор не изменяет строку на вводной набор символов так, как это сделает CONVERT(). Он не изменяет значение строки, хотя возможно добавление пробелов. Вводный набор — это всего лишь сигнал.
Для литералов строковых значений пробелы между вводным набором и строкой разрешены, но необязательны.
Для литералов наборов символов вводный набор указывает набор символов для последующей строки, но не изменяет способ, которым парсер выполняет обработку экранирования внутри строки. Экранирование всегда интерпретируется парсером в соответствии с набором символов, заданным character_set_connection. Дополнительные обсуждения и примеры см. в разделе 12.3.6 «Набор символов и сортировка литералов строковых значений».
Примеры:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
SELECT _latin1 X'4D7953514C';
SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
SELECT _latin1 b'1000001';
SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;
Вводные наборы символов и COLLATE предложение реализуются в соответствии со стандартными спецификациями SQL.
Литералы строковых значений могут быть обозначены как бинарные строки с помощью вводного набора _binary. Шестнадцатеричные литералы и литералы значений битов по умолчанию являются бинарными строками, поэтому _binary разрешён, но обычно не нужен. _binary может быть полезно для сохранения шестнадцатеричного или битового литерала как бинарной строки в контекстах, в которых литерал в противном случае обрабатывается как число. Например, битовые операции допускают числовые или бинарные строковые аргументы в MySQL 8.4 и выше, но по умолчанию обрабатывают шестнадцатеричные и битовые литералы как числа. Чтобы явно указать бинарный контекст строки для таких литералов, используйте вводный набор _binary как минимум для одного из аргументов:
mysql> SET @v1 = X'000D' | X'0BC0';
mysql> SET @v2 = _binary X'000D' | X'0BC0';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| BCD | 0BCD |
+----------+----------+
Отображаемый результат выглядит похожим для обеих битовых операций, но результат без _binary — это значение BIGINT, в то время как результат с _binary — это бинарная строка. Из-за разницы в типах результатов отображаемые значения отличаются: ведущие нули не отображаются для числового результата.
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_nameДля литерала строкового значения используется набор символов по умолчанию соединения, заданный системной переменной
character_set_connection, и сортировкаcollation_name.collation_nameдолжна быть допустимой сортировкой для набора символов по умолчанию соединения.Для шестнадцатеричного литерала или литерала значения бита допустимой сортировкой является только
binary, поскольку эти типы литералов по умолчанию являются бинарными строками.
-
В противном случае (ни
_charset_name, ниCOLLATEне заданы):collation_nameДля литерала строкового значения используются набор символов и сортировка по умолчанию соединения, заданные системными переменными
character_set_connectionиcollation_connection.Для шестнадцатеричного литерала или литерала значения бита набор символов и сортировка — это
binary.
Примеры:
-
Небинарные строки с набором символов
latin1и сортировкойlatin1_german1_ci:SELECT _latin1'Müller' COLLATE latin1_german1_ci; SELECT _latin1 X'0A0D' COLLATE latin1_german1_ci; SELECT _latin1 b'0110' COLLATE latin1_german1_ci;
-
Небинарные строки с набором символов
utf8mb4и его сортировкой по умолчанию (то естьutf8mb4_0900_ai_ci):SELECT _utf8mb4'Müller'; SELECT _utf8mb4 X'0A0D'; SELECT _utf8mb4 b'0110';
-
Бинарные строки с набором символов
binaryи его сортировкой по умолчанию (то естьbinary):SELECT _binary'Müller'; SELECT X'0A0D'; SELECT b'0110';
Шестнадцатеричный литерал и литерал значения бита не нуждаются во вводном наборе, поскольку они по умолчанию являются бинарными строками.
-
Небинарная строка с набором символов по умолчанию соединения и сортировкой
utf8mb4_0900_ai_ci(ошибка, если набор символов соединения неutf8mb4):SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
Эта конструкция (только
COLLATE) не работает для шестнадцатеричных литералов или литералов значений бита, поскольку их набор символов —binaryнезависимо от набора символов соединения, аbinaryнесовместим с сортировкойutf8mb4_0900_ai_ci. Единственное разрешённоеCOLLATEпредложение в отсутствие вводного набора —COLLATE binary. -
Строка с набором символов и сортировкой по умолчанию соединения:
SELECT 'Müller';
© 2025 Oracle
Licensed under the GPLv2 License.