14.8.1 Функции и операторы сравнения строк
Таблица 14.13 Функции и операторы сравнения строк
Если строковой функции передается двоичная строка в качестве аргумента, результирующая строка также будет двоичной. Число, преобразованное в строку, обрабатывается как двоичная строка. Это влияет только на сравнения.
Обычно, если какой-либо выражение в сравнении строк чувствительно к регистру, сравнение выполняется с учетом регистра.
Если строковая функция вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате, в зависимости от значения параметра --binary-as-hex. Более подробную информацию об этом параметре см. в разделе 6.5.1, «mysql — Клиент командной строки MySQL».
-
exprLIKEpat[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, по умолчанию используется\, если не включен режим SQLNO_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содержала литеральную строку\, вы должны указать ее дважды. (Если не включен режим SQLNO_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 | +--------------+-----------------------+ -
exprNOT LIKEpat[ESCAPE 'escape_char']Это то же самое, что и
NOT (.exprLIKEpat[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всегда возвращаетexprNULL, независимо от значенияexpr. То же самое верно для запросов агрегирования, включающихNULLи сравнений с использованиемNOT RLIKEилиNOT REGEXP. В таких случаях необходимо явно проверять наNOT NULLс использованиемOR(а неAND), как показано здесь:SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
-
STRCMP()возвращает0, если строки совпадают,-1, если первый аргумент меньше второго в соответствии с текущим порядком сортировки, иNULL, если любой из аргументов равенNULL. В противном случае он возвращает1.mysql>
SELECT STRCMP('text', 'text2');-> -1 mysql>SELECT STRCMP('text2', 'text');-> 1 mysql>SELECT STRCMP('text', 'text');-> 0STRCMP()выполняет сравнение, используя язык сортировки аргументов.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.