14.8.3 Набор символов и сортировка результатов функций
MySQL содержит множество операторов и функций, возвращающих строку. В этом разделе рассматривается вопрос: каков набор символов и сортировка такой строки?
Для простых функций, принимающих строковый ввод и возвращающих строковый результат, набор символов и сортировка результата совпадают с набором символов и сортировкой основного входного значения. Например, UPPER( возвращает строку с тем же набором символов и сортировкой, что и X)X. То же самое относится к INSTR(), LCASE(), LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), SUBSTRING(), TRIM(), UCASE() и UPPER().
Функция REPLACE(), в отличие от всех других функций, всегда игнорирует сортировку строкового ввода и выполняет сравнение с учётом регистра.
Если строковый ввод или результат функции является бинарной строкой, строка имеет набор символов и сортировку binary. Это можно проверить, используя функции CHARSET() и COLLATION(), обе из которых возвращают binary для аргумента бинарной строки:
mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary | binary |
+---------------------+-----------------------+
Для операций, объединяющих несколько строковых входов и возвращающих один строковый вывод, правила агрегации стандартного SQL применяются для определения сортировки результата:
Если происходит явное
COLLATE, используйтеYY.Если явные
COLLATEиYCOLLATEпроисходят, выдаётся ошибка.ZВ противном случае, если все сортировки —
Y, используйтеY.В противном случае результат не имеет сортировки.
Например, при использовании CASE ... WHEN a THEN b WHEN b THEN c
COLLATE , результирующая сортировка — X ENDX. То же самое относится к UNION, ||, CONCAT(), ELT(), GREATEST(), IF() и LEAST().
Для операций преобразования в символьные данные набор символов и сортировка получаемых строк определяются системными переменными character_set_connection и collation_connection, которые определяют набор символов и сортировку по умолчанию соединения (см. Раздел 12.4, «Наборы символов и сортировки соединений»). Это относится только к BIN_TO_UUID(), CAST(), CONV(), FORMAT(), HEX() и SPACE().
Исключением из этого принципа являются выражения для виртуальных сгенерированных столбцов. В таких выражениях для результатов BIN_TO_UUID(), CONV() или HEX() используется набор символов таблицы, независимо от набора символов подключения.
Если есть вопросы относительно набора символов или сортировки результата, возвращаемого строковой функцией, используйте функцию CHARSET() или COLLATION() для выяснения:
mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+--------------------+
| USER() | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+--------------------+
| test@localhost | utf8mb3 | utf8mb3_general_ci |
+----------------+-----------------+--------------------+
mysql> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+--------------------------+----------------------------+
| CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) |
+--------------------------+----------------------------+
| binary | binary |
+--------------------------+----------------------------+
© 2025 Oracle
Licensed under the GPLv2 License.