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 9.2 и выше, но по умолчанию обрабатывают шестнадцатеричные и битовые литералы как числа. Чтобы явно указать бинарный строковый контекст для таких литералов, используйте введение _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.