Spec-Zone.ru › MySQL 5.7

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

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

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

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

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

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

  • expr LIKE pat [ESCAPE 'escape_char']

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

    Шаблон не обязательно должен быть буквальной строкой. Например, он может быть задан как строковое выражение или столбец таблицы. В последнем случае столбец должен быть определён как один из строковых типов MySQL (см. Раздел 11.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 значения), выполняемых с оператором =:

    mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
    +------------+---------------+
    | 'a' = 'a ' | 'a' LIKE 'a ' |
    +------------+---------------+
    |          1 |             0 |
    +------------+---------------+
    1 row in set (0.00 sec)
    

    С 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 _latin1 'ABC' COLLATE latin1_general_cs;
            -> 0
    mysql> SELECT 'abc' LIKE _latin1 'ABC' COLLATE latin1_bin;
            -> 0
    mysql> SELECT 'abc' LIKE BINARY 'ABC';
            -> 0
    

    Как расширение стандарта SQL, MySQL позволяет применять LIKE к числовым выражениям.

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

    В таких случаях MySQL пытается выполнить неявное преобразование выражения в строку. См. Раздел 12.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, если первый аргумент меньше второго в соответствии с текущим порядком сортировки, и 1 в противном случае.

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

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

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

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

    mysql> SELECT STRCMP(@s1, @s3);
    ERROR 1267 (HY000): Illegal mix of collations (latin1_general_ci,IMPLICIT)
    and (latin1_general_cs,IMPLICIT) for operation 'strcmp'
    mysql> SELECT STRCMP(@s1, @s3 COLLATE latin1_general_ci);
    +--------------------------------------------+
    | STRCMP(@s1, @s3 COLLATE latin1_general_ci) |
    +--------------------------------------------+
    |                                          0 |
    +--------------------------------------------+
    

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

Spec-Zone.ru

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