Spec-Zone.ru › MySQL 8.4

14.8.1 Функции и операторы сравнения строк

Таблица 14.13 Функции и операторы сравнения строк

Таблица 14.13 Функции и операторы сравнения строк
Имя Описание
LIKE Простое сопоставление шаблонов
NOT LIKE Отрицание простого сопоставления шаблонов
STRCMP() Сравнение двух строк

Если строковой функции передается двоичная строка в качестве аргумента, результирующая строка также будет двоичной. Число, преобразованное в строку, обрабатывается как двоичная строка. Это влияет только на сравнения.

Обычно, если какой-либо выражение в сравнении строк чувствительно к регистру, сравнение выполняется с учетом регистра.

Если строковая функция вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате, в зависимости от значения параметра --binary-as-hex. Более подробную информацию об этом параметре см. в разделе 6.5.1, «mysql — Клиент командной строки MySQL».

  • expr LIKE pat [ESCAPE 'escape_char']

    Сопоставление шаблонов с использованием SQL-шаблона. Возвращает 1 (TRUE) или 0 (FALSE). Если либо expr, либо pat равно NULL, результат равен NULL.

    Шаблон необязательно должен быть литеральной строкой. Например, он может быть указан как выражение строки или столбец таблицы. В последнем случае столбец должен быть определен как один из строковых типов MySQL (см. раздел 13.3, «Типы данных строк»).

    Согласно стандарту SQL, LIKE выполняет сопоставление на основе каждого символа, что может привести к результатам, отличным от оператора сравнения =:

    mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
    +-----------------------------------------+
    | 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
    +-----------------------------------------+
    |                                       0 |
    +-----------------------------------------+
    mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
    +--------------------------------------+
    | 'ä' = 'ae' COLLATE latin1_german2_ci |
    +--------------------------------------+
    |                                    1 |
    +--------------------------------------+
    

    В частности, пробелы в конце всегда имеют значение. Это отличается от сравнений, выполняемых с оператором =, для которого значение пробелов в конце небинарных строк (CHAR, VARCHAR и TEXT значения) зависит от атрибута заполнения используемого для сравнения языка сортировки. Дополнительную информацию см. в Обработке пробелов в конце при сравнениях.

    С помощью LIKE вы можете использовать следующие два символа подстановки в шаблоне:

    • % соответствует любому числу символов, в том числе нулю.

    • _ соответствует ровно одному символу.

    mysql> SELECT 'David!' LIKE 'David_';
            -> 1
    mysql> SELECT 'David!' LIKE '%D%v%';
            -> 1
    

    Чтобы проверить наличие символа подстановки в литеральном виде, предваряйте его символом экранирования. Если вы не укажете символ ESCAPE, по умолчанию используется \, если не включен режим SQL NO_BACKSLASH_ESCAPES. В этом случае символ экранирования не используется.

    • \% соответствует одному символу %.

    • \_ соответствует одному символу _.

    mysql> SELECT 'David!' LIKE 'David\_';
            -> 0
    mysql> SELECT 'David_' LIKE 'David\_';
            -> 1
    

    Чтобы указать другой символ экранирования, используйте предложение ESCAPE:

    mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
            -> 1
    

    Последовательность экранирования должна быть длиной в один символ, чтобы указать символ экранирования, или пустой, чтобы указать, что символ экранирования не используется. Выражение должно оцениваться как константа во время выполнения. Если включен режим SQL NO_BACKSLASH_ESCAPES, последовательность не может быть пустой.

    Следующие операторы иллюстрируют, что сравнения строк нечувствительны к регистру, если только один из операндов чувствителен к регистру (использует чувствительный к регистру язык сортировки или является двоичной строкой):

    mysql> SELECT 'abc' LIKE 'ABC';
            -> 1
    mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_0900_as_cs;
            -> 0
    mysql> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_bin;
            -> 0
    mysql> SELECT 'abc' LIKE BINARY 'ABC';
            -> 0
    

    В качестве расширения стандартного SQL MySQL разрешает LIKE на числовых выражениях.

    mysql> SELECT 10 LIKE '1%';
            -> 1
    

    В таких случаях MySQL пытается выполнить неявное преобразование выражения в строку. См. раздел 14.3, «Преобразование типов при вычислении выражений».

    Примечание

    MySQL использует синтаксис экранирования C в строках (например, \n для представления символа новой строки). Если вы хотите, чтобы строка LIKE содержала литеральную строку \, вы должны указать ее дважды. (Если не включен режим SQL NO_BACKSLASH_ESCAPES, в этом случае символ экранирования не используется.) Например, для поиска \n, укажите его как \\n. Для поиска \, укажите его как \\\\; это связано с тем, что обратные косые черты удаляются один раз парсером и снова при выполнении сопоставления шаблона, оставляя одну обратную косую черту для сопоставления.

    Исключение: в конце строки шаблона обратную косую черту можно указать как \\. В конце строки обратная косая черта обозначает себя, потому что после нее нет ничего для экранирования. Предположим, что таблица содержит следующие значения:

    mysql> SELECT filename FROM t1;
    +--------------+
    | filename     |
    +--------------+
    | C:           |
    | C:\          |
    | C:\Programs  |
    | C:\Programs\ |
    +--------------+
    

    Для проверки значений, заканчивающихся обратной косой чертой, можно использовать любой из следующих шаблонов:

    mysql> SELECT filename, filename LIKE '%\\' FROM t1;
    +--------------+---------------------+
    | filename     | filename LIKE '%\\' |
    +--------------+---------------------+
    | C:           |                   0 |
    | C:\          |                   1 |
    | C:\Programs  |                   0 |
    | C:\Programs\ |                   1 |
    +--------------+---------------------+
    
    mysql> SELECT filename, filename LIKE '%\\\\' FROM t1;
    +--------------+-----------------------+
    | filename     | filename LIKE '%\\\\' |
    +--------------+-----------------------+
    | C:           |                     0 |
    | C:\          |                     1 |
    | C:\Programs  |                     0 |
    | C:\Programs\ |                     1 |
    +--------------+-----------------------+
    
  • expr NOT LIKE pat [ESCAPE 'escape_char']

    Это то же самое, что и NOT (expr LIKE pat [ESCAPE 'escape_char']).

    Примечание

    Запросы агрегирования, включающие NOT LIKE сравнения с столбцами, содержащими NULL, могут давать неожиданные результаты. Например, рассмотрим следующую таблицу и данные:

    CREATE TABLE foo (bar VARCHAR(10));
    
    INSERT INTO foo VALUES (NULL), (NULL);
    

    Запрос SELECT COUNT(*) FROM foo WHERE bar LIKE '%baz%'; возвращает 0. Можно предположить, что SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%'; вернет 2. Однако это не так: второй запрос возвращает 0. Это связано с тем, что NULL NOT LIKE expr всегда возвращает NULL, независимо от значения expr. То же самое верно для запросов агрегирования, включающих NULL и сравнений с использованием NOT RLIKE или NOT REGEXP. В таких случаях необходимо явно проверять на NOT NULL с использованием OR (а не AND), как показано здесь:

    SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
    
  • STRCMP(expr1,expr2)

    STRCMP() возвращает 0, если строки совпадают, -1, если первый аргумент меньше второго в соответствии с текущим порядком сортировки, и NULL, если любой из аргументов равен NULL. В противном случае он возвращает 1.

    mysql> SELECT STRCMP('text', 'text2');
            -> -1
    mysql> SELECT STRCMP('text2', 'text');
            -> 1
    mysql> SELECT STRCMP('text', 'text');
            -> 0
    

    STRCMP() выполняет сравнение, используя язык сортировки аргументов.

    mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs;
    mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs;
    mysql> SELECT STRCMP(@s1, @s2), STRCMP(@s3, @s4);
    +------------------+------------------+
    | STRCMP(@s1, @s2) | STRCMP(@s3, @s4) |
    +------------------+------------------+
    |                0 |               -1 |
    +------------------+------------------+
    

    Если языки сортировки несовместимы, один из аргументов должен быть преобразован в совместимый с другим. См. раздел 12.8.4, «Совместимость языков сортировки в выражениях».

    mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs;
    mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs;
    -->
    mysql> SELECT STRCMP(@s1, @s3);
    ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT)
    and (utf8mb4_0900_as_cs,IMPLICIT) for operation 'strcmp'
    mysql> SELECT STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci);
    +---------------------------------------------+
    | STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci) |
    +---------------------------------------------+
    |                                           0 |
    +---------------------------------------------+
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/string-comparison-functions.html

Spec-Zone.ru

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