Spec-Zone .ru
спецификации, руководства, описания, API
|
Если строковой функции дают двоичную строку как параметр, получающаяся строка является также двоичной строкой. Число, преобразованное в строку, обрабатывается как двоичная строка. Это влияет только на сравнения.
Обычно, если какое-либо выражение в сравнении строк является чувствительным к регистру, сравнение выполняется чувствительным к регистру способом.
expr
LIKE pat
[ESCAPE 'escape_char
']
Сопоставление с образцом используя SQL простое сравнение регулярного выражения. Возвраты 1
(TRUE
) или 0
(FALSE
). Если также expr
или
pat
NULL
, результат NULL
.
Образец не должен быть литеральной строкой. Например, это может быть определено как строковое выражение или столбец таблицы.
На стандарт 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
сравнения, выполняемые с =
оператор:
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_';
-> 1mysql>SELECT 'David!' LIKE '%D%v%';
-> 1
Чтобы протестировать на литеральные экземпляры подстановочного символа, предшествуйте этому символом
ESC. Если Вы не определяете ESCAPE
символ,"\
"принимается.
Строка | Описание |
---|---|
\% |
Соответствия один"% "символ
|
\_ |
Соответствия один"_ "символ
|
mysql>SELECT 'David!' LIKE 'David\_';
-> 0mysql>SELECT 'David_' LIKE 'David\_';
-> 1
Чтобы определить различный символ ESC, используйте ESCAPE
пункт:
mysql> SELECT 'David_' LIKE 'David|_'
ESCAPE '|';
-> 1
Escape-последовательность должна быть пустой или один символ долго. Выражение должно оценить как
константа во время выполнения. Если NO_BACKSLASH_ESCAPES
Режим SQL включается, последовательность не
может быть пустой.
Следующие два оператора иллюстрируют, что сравнения строк не являются чувствительными к регистру, если один из операндов не является двоичной строкой:
mysql>SELECT 'abc' LIKE 'ABC';
-> 1mysql>SELECT 'abc' LIKE BINARY 'ABC';
-> 0
В MySQL, LIKE
разрешается на числовых выражениях. (Это - расширение стандартного SQL LIKE
.)
mysql> SELECT 10 LIKE
'1%';
-> 1
Поскольку MySQL использует синтаксис escape C в строках (например,"\n
"чтобы представить символ
новой строки), следует удвоить любого"\
"то, что Вы используете в LIKE
строки. Например, чтобы искать"\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()
возвраты 0
если строки являются тем же самым, -1
если первый параметр меньше чем второе согласно текущему порядку
сортировки, и 1
иначе.
mysql>SELECT STRCMP('text', 'text2');
-> -1mysql>SELECT STRCMP('text2', 'text');
-> 1mysql>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.1.7.5, "Сопоставление Выражений".
mysql>SELECT STRCMP(@s1, @s3);
ERROR 1267 (HY000) at line 10: 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 |+--------------------------------------------+