12.8.1 Функции и операторы сравнения строк
Таблица 12.13 Функции и операторы сравнения строк
Если строковой функции передаётся двоичная строка в качестве аргумента, результирующая строка также будет двоичной. Число, преобразованное в строку, рассматривается как двоичная строка. Это влияет только на сравнения.
Обычно, если какой-либо выражение в сравнении строк чувствительно к регистру, сравнение выполняется с учётом регистра.
Если строковая функция вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате, в зависимости от значения параметра --binary-as-hex. Для получения более подробной информации об этом параметре, см. Раздел 4.5.1, «mysql — Клиент командной строки MySQL».
-
exprLIKEpat[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, предполагается использование\, если не включен режим 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 _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, содержащая буквальный\, вы должны указать его дважды. (Если не включён режим 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, если первый аргумент меньше второго в соответствии с текущим порядком сортировки, и1в противном случае.mysql>
SELECT STRCMP('text', 'text2');-> -1 mysql>SELECT STRCMP('text2', 'text');-> 1 mysql>SELECT STRCMP('text', 'text');-> 0STRCMP()выполняет сравнение с использованием сортировки аргументов.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.