如果字符串函数的参数是二进制字符串,则结果字符串也是二进制字符串。转换为字符串的数字将被视为二进制字符串。这仅影响比较。
通常,如果字符串比较中的任何表达式区分大小写,则比较将以区分大小写的方式执行。
如果从 mysql 客户端内部调用字符串函数,则二进制字符串将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。有关该选项的更多信息,请参见 第 6.5.1 节,“mysql — MySQL 命令行客户端”。
exprLIKEpat[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字符,则假定为\,除非启用了NO_BACKSLASH_ESCAPESSQL 模式。在这种情况下,不使用转义字符。\%匹配一个%字符。\_匹配一个_字符。
mysql> SELECT 'David!' LIKE 'David\_'; -> 0 mysql> SELECT 'David_' LIKE 'David\_'; -> 1要指定不同的转义字符,请使用
ESCAPE子句mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1转义序列应为一个字符长,以指定转义字符,或者为空以指定不使用转义字符。表达式在执行时必须求值为常量。如果启用了
NO_BACKSLASH_ESCAPESSQL 模式,则序列不能为空。以下语句说明字符串比较不区分大小写,除非其中一个操作数区分大小写(使用区分大小写的排序规则或为二进制字符串)
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 节,“表达式求值中的类型转换”。
注意MySQL 在字符串中使用 C 转义语法(例如,使用
\n表示换行符)。如果希望LIKE字符串包含文字\,则必须将其加倍。(除非启用了NO_BACKSLASH_ESCAPESSQL 模式,在这种情况下不使用转义字符。)例如,要搜索\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进行比较的聚合查询也是如此。在这种情况下,您必须使用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'); -> 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 | +------------------+------------------+如果排序规则不兼容,则必须转换其中一个参数以使其与另一个参数兼容。请参阅第 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 | +---------------------------------------------+