Table 11.8. String Comparison Operators
Name | Description |
---|---|
LIKE | Simple pattern matching |
NOT LIKE | Negation of simple pattern matching |
STRCMP() | Compare two strings |
If a string function is given a binary string as an argument, the resulting string is also a binary string. A number converted to a string is treated as a binary string. This affects only comparisons.
Normally, if any expression in a string comparison is case sensitive, the comparison is performed in case-sensitive fashion.
expr
LIKEpat
[ESCAPE 'escape_char
']Pattern matching using SQL simple regular expression comparison. Returns
1
(TRUE
) or0
(FALSE
). If eitherexpr
orpat
isNULL
, the result isNULL
.The pattern need not be a literal string. For example, it can be specified as a string expression or table column.
Per the SQL standard,
LIKE
performs matching on a per-character basis, thus it can produce results different from the=
comparison operator: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 | +--------------------------------------+In particular, trailing spaces are significant, which is not true for
CHAR
orVARCHAR
comparisons performed with the=
operator:mysql>
SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+ | 'a' = 'a ' | 'a' LIKE 'a ' | +------------+---------------+ | 1 | 0 | +------------+---------------+ 1 row in set (0.00 sec)With
LIKE
you can use the following two wildcard characters in the pattern.Character Description %
Matches any number of characters, even zero characters _
Matches exactly one character mysql>
SELECT 'David!' LIKE 'David_';
-> 1 mysql>SELECT 'David!' LIKE '%D%v%';
-> 1To test for literal instances of a wildcard character, precede it by the escape character. If you do not specify the
ESCAPE
character, “\
” is assumed.String Description \%
Matches one “ %
” character\_
Matches one “ _
” charactermysql>
SELECT 'David!' LIKE 'David\_';
-> 0 mysql>SELECT 'David_' LIKE 'David\_';
-> 1To specify a different escape character, use the
ESCAPE
clause:mysql>
SELECT 'David_' LIKE 'David|_' ESCAPE '|';
-> 1The escape sequence should be empty or one character long. If the
NO_BACKSLASH_ESCAPES
SQL mode is enabled, the sequence cannot be empty.The following two statements illustrate that string comparisons are not case sensitive unless one of the operands is a binary string:
mysql>
SELECT 'abc' LIKE 'ABC';
-> 1 mysql>SELECT 'abc' LIKE BINARY 'ABC';
-> 0In MySQL,
LIKE
is permitted on numeric expressions. (This is an extension to the standard SQLLIKE
.)mysql>
SELECT 10 LIKE '1%';
-> 1NoteBecause MySQL uses C escape syntax in strings (for example, “
\n
” to represent a newline character), you must double any “\
” that you use inLIKE
strings. For example, to search for “\n
”, specify it as “\\n
”. To search for “\
”, specify it as “\\\\
”; this is because the backslashes are stripped once by the parser and again when the pattern match is made, leaving a single backslash to be matched against.Exception: At the end of the pattern string, backslash can be specified as “
\\
”. At the end of the string, backslash stands for itself because there is nothing following to escape. Suppose that a table contains the following values:mysql>
SELECT filename FROM t1;
+--------------+ | filename | +--------------+ | C: | | C:\ | | C:\Programs | | C:\Programs\ | +--------------+To test for values that end with backslash, you can match the values using either of the following patterns:
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 LIKEpat
[ESCAPE 'escape_char
']This is the same as
NOT (
.expr
LIKEpat
[ESCAPE 'escape_char
'])NoteAggregate queries involving
NOT LIKE
comparisons with columns containingNULL
may yield unexpected results. For example, consider the following table and data:CREATE TABLE foo (bar VARCHAR(10)); INSERT INTO foo VALUES (NULL), (NULL);
The query
SELECT COUNT(*) FROM foo WHERE bar LIKE '%baz%';
returns0
. You might assume thatSELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%';
would return2
. However, this is not the case: The second query returns0
. This is becauseNULL NOT LIKE
always returnsexpr
NULL
, regardless of the value ofexpr
. The same is true for aggregate queries involvingNULL
and comparisons usingNOT RLIKE
orNOT REGEXP
. In such cases, you must test explicitly forNOT NULL
usingOR
(and notAND
), as shown here:SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%' OR bar IS NULL;
STRCMP()
returns0
if the strings are the same,-1
if the first argument is smaller than the second according to the current sort order, and1
otherwise.mysql>
SELECT STRCMP('text', 'text2');
-> -1 mysql>SELECT STRCMP('text2', 'text');
-> 1 mysql>SELECT STRCMP('text', 'text');
-> 0STRCMP()
performs the comparison using the collation of the arguments.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 | +------------------+------------------+If the collations are incompatible, one of the arguments must be converted to be compatible with the other. See Section 9.1.7.5, “Collation of Expressions”.
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 | +--------------------------------------------+