Spec-Zone.ru › MySQL 9.2

12.3.8 Введение набора символов

Литерал строковой константы, шестнадцатеричной константы или битовой константы может иметь необязательное введение набора символов и COLLATE-описатель, чтобы обозначить её как строку, использующую определённый набор символов и сортировку:

[_charset_name] literal [COLLATE collation_name]

Выражение _charset_name формально называется введением. Оно сообщает анализатору: “строка, которая следует за этим, использует набор символов charset_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_name, используются набор символов charset_name и сортировка collation_name. collation_name должен быть допустимой сортировкой для charset_name.

  • Если задан _charset_name, но COLLATE не задан, используются набор символов charset_name и его сортировка по умолчанию. Чтобы увидеть сортировку по умолчанию для каждого набора символов, используйте оператор SHOW CHARACTER SET или запросите таблицу INFORMATION_SCHEMA CHARACTER_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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/charset-introducer.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API