Spec-Zone.ru › MySQL 8.4

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 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_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-8.4-en/charset-introducer.html

Spec-Zone.ru

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