- 如果给字符串函数一个二进制字符串作为参数,则生成的字符串也是一个二进制字符串。转换为字符串的数字被视为二进制字符串。这仅影响比较。
- 通常,如果字符串比较中的任何表达式区分大小写,则以区分大小写的方式执行比较。
- 如果从 mysql 客户端调用字符串函数,则二进制字符串使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
函数 |
说明 |
LIKE |
简单的模式匹配 |
NOT LIKE |
简单模式匹配的否定 |
STRCMP() |
比较两个字符串 |
LIKE / NOT LIKE
- 使用 SQL 模式进行模式匹配。返回 1 (TRUE) 或 0 (FALSE)。如果 expr 或 pat 为 NULL,则结果为 NULL。
- 模式不必是文字字符串。例如,它可以指定为字符串表达式或表格列。在后一种情况下,列必须定义为 MySQL 字符串类型之一
语法
expr LIKE pat [ESCAPE 'escape_char']
NOT (expr LIKE pat [ESCAPE 'escape_char'])
- 通配符匹配
- 使用
LIKE,您可以在模式中使用以下两个通配符:
- % 匹配任意数量的字符,甚至是零个字符。
- _ 只匹配一个字符。
- 使用
LIKE,您可以在模式中使用以下两个通配符:
mysql> SELECT 'David!' LIKE 'David_';
-> 1
mysql> SELECT 'David!' LIKE '%D%v%';
-> 1
- 转义字符匹配
- 要测试通配符的文字实例,请在其前面加上转义字符。如果未指定 ESCAPE
字符,则假定为 \,除非启用了 NO_BACKSLASH_ESCAPE
SQL 模式。在这种情况下,不使用转义字符。
- \% 匹配一个 % 字符。
- \_ 匹配一个 _ 字符。
- 要测试通配符的文字实例,请在其前面加上转义字符。如果未指定 ESCAPE
字符,则假定为 \,除非启用了 NO_BACKSLASH_ESCAPE
SQL 模式。在这种情况下,不使用转义字符。
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 标准,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 属性
STRCMP()
- 如果字符串相同,则 STRCMP() 返回 0
- 如果根据当前排序顺序,第一个参数小于第二个参数,则返回 -1,否则返回 1。
语法
STRCMP(expr1,expr2)
示例
mysql> SELECT STRCMP('text', 'text2');
-> -1
mysql> SELECT STRCMP('text2', 'text');
-> 1
mysql> SELECT STRCMP('text', 'text');
-> 0
- 使用参数的排序规则执行比较
示例
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, @s3
COLLATE utf8mb4_0900_ai_ci);
+------------------------------------------------------------+
| STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci) |
+------------------------------------------------------------+
| 0 |
+------------------------------------------------------------+
来自 <https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html>