如果字符串函数给定一个二进制字符串作为参数,结果字符串也是二进制字符串。将数字转换为字符串将其视为二进制字符串。这只影响比较。
通常,如果字符串比较中的任何表达式是区分大小写的,那么比较将以区分大小写的方式进行。
如果从 mysql 客户端调用字符串函数,二进制字符串将以十六进制表示法显示,取决于 --binary-as-hex
选项的值。有关该选项的更多信息,请参见 第 6.5.1 节,“mysql — MySQL 命令行客户端”。
-
expr
LIKEpat
[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
值)中尾随空格的重要性取决于用于比较的排序规则的 pad 属性。有关更多信息,请参见 尾随空格处理在比较中。使用
LIKE
可以在模式中使用以下两个通配符:-
%
匹配零个或多个字符。 -
_
匹配恰好一个字符。
mysql> SELECT 'David!' LIKE 'David_'; -> 1 mysql> SELECT 'David!' LIKE '%D%v%'; -> 1
要测试通配符字符的文字实例,请在其前面加上 escape 字符。如果您不指定
ESCAPE
字符,\
将被假定为 escape 字符,除非启用了NO_BACKSLASH_ESCAPES
SQL 模式。在那种情况下,不使用 escape 字符。-
\%
匹配一个%
字符。 -
\_
匹配一个_
字符。
mysql> SELECT 'David!' LIKE 'David\_'; -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1
要指定不同的 escape 字符,请使用
ESCAPE
子句:mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1
escape 序列应该是一个字符长,以指定 escape 字符,或者为空,以指定不使用 escape 字符。表达式必须在执行时评估为常量。如果启用了
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 在这种情况下尝试执行隐式字符串转换。请参阅 第 14.3 节,“表达式评估中的类型转换”。
NoteMySQL 在字符串中使用 C escape 语法(例如,
\n
代表换行符)。如果您想在LIKE
字符串中包含文字\
,则必须将其双倍。(除非启用了NO_BACKSLASH_ESCAPES
SQL 模式,在这种情况下,不使用转义字符。)例如,要搜索\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 LIKEpat
[ESCAPE 'escape_char
']这与
NOT (
相同。expr
LIKEpat
[ESCAPE 'escape_char
'])Note涉及
NOT LIKE
比较的聚合查询可能会产生意外结果。例如,考虑以下表和数据: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
的值如何。在这种情况下,您必须使用OR
(而不是AND
)显式测试NOT NULL
,如下所示: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'); -> 0
STRCMP()
使用参数的排序规则进行比较。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 | +---------------------------------------------+