字符串比较函数和运算符
表字符串比较函数和运算符
名称 | 描述 |
---|---|
LIKE | 简单模式匹配 |
NOT LIKE | 否定简单模式匹配 |
STRCMP() | 比较两个字符串 |
如果给字符串函数一个二进制字符串作为参数,则结果字符串也是二进制字符串。转换为字符串的数字被视为二进制字符串。这仅影响比较。
通常,如果字符串比较中的任何表达式区分大小写,则以区分大小写的方式执行比较。
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_'; -> 1 mysql>SELECT 'David!' LIKE '%D%v%'; -> 1要测试通配符的文字实例,请在其前面加上转义符。如果未指定
ESCAPE
字符,\
则假定为。\%
匹配一个%
字符。\_
匹配一个_
字符。
mysql>
SELECT 'David!' LIKE 'David\_'; -> 0 mysql>SELECT 'David_' LIKE 'David\_'; -> 1要指定其他转义字符,请使用以下
ESCAPE
子句:mysql>
SELECT 'David_' LIKE 'David|_'ESCAPE '|'; -> 1转义序列应为空或一个字符长。该表达式在执行时必须计算为常量。如果
NO_BACKSLASH_ESCAPES
启用了 SQL模式,则序列不能为空。以下两个语句说明,字符串比较不区分大小写,除非其中一个操作数区分大小写(使用区分大小写的归类或二进制字符串):
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在字符串中使用C转义语法(例如,
\n
表示换行符),因此必须\
将在LIKE
字符串中使用的任何内容加倍。例如,要搜索\n
,请将其指定为\\n
。要搜索\
,请将其指定为\\\\
;这是因为解析器会一次删除反斜杠,而在进行模式匹配时会再次反斜杠,因此要匹配一个反斜杠。例外:在模式字符串的末尾,反斜杠可以指定为
\\
。在字符串的末尾,反斜杠代表自身,因为没有其他内容可以逃脱。假设一个表包含以下值:mysql>
SELECT filenameFROM 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 fooVALUES (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 fooWHERE 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'); -> 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 | +------------------ +------------------ +如果校验规则不兼容,则必须将其中一个参数转换为与另一个兼容。请参见“表达式中的校验规则强制性”。
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, @s3COLLATE utf8mb4_0900_ai_ci); +--------------------------------------------- + | STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci) | +--------------------------------------------- + | 0 | +--------------------------------------------- +