MySQL 模式匹配
LIKE模式
利用 LIKE 运算符以及通配符 "%"(能匹配任意字符序列)和 "_"(只能匹配单个字符)实现的。
- 通配符"%"能匹配任何字符串,包括空字符串,但是不能匹配 NULL
- 如果 LIKE 的一边为二进制串,则两边都当成二进制串比较,如果都不是二进制串,则根据它们的排序规则来进行比较
正则表达式 REGEXP
利用 REGEXP 运算符和正则表达式实现的。
-
点号字符 "." 可以匹配任何单个字符,如:
- 'abc' REGEXP 'a.c'
-
方括号 "[...]" 可以匹配列在方括号内部的任何字符,如:
- 'e' REGEXP '[aeiou]'
-
连接符 "-" 可用于指定字符范围,其两端分别为范围的起始和结束字符。"^" 用于把这个字符范围的含义变反(匹配未列在其中的字符),如:
- 'abc' REGEXP '[a-z]'
- 'abc' REGEXP '[^d-z]'
- "*" 表示匹配前面的子表达式零次或多次,如:
- 'abcdef' REGEXP 'a.*f'
- 'xxxxx' REGEXP 'x*'
- 'abc' REGEXP '[0-9]*abc' 因为任意个包括 0 个
- 如果要匹配前面的子表达式一次或多次,则需要使用 "+" 来代替 "*",如:
- 'abc' REGEXP 'cd*' -- 可以匹配零次
- 'abc' REGEXP 'cd+' 错误 -- 不可以匹配零次,至少匹配一次
- 'abcd' REGEXP 'cd+'
-
"^pattern" & "pattern$" 模式,当 pattern 出现在字符串的开头或结尾时,匹配成功,而 "^pattern$" 只有匹配整个 pattern 才能匹配成功,如:
- 'abc' REGEXP 'b'
- 'abc' REGEXP '^abc$'
- 'abc' REGEXP '^a'
- 'abc' REGEXP 'bc$'
两者之间差异
除了使用运算符不同之外,两个重要的差异:
- SQL 的 LIKE 模式只用于匹配整个字符串;正则表达式 REGEXP 可以匹配字符串的任何部分。
- LIKE 运算符是多字节安全的。REGEXP 运算符只能正确地处理单字节字符集,并不会考虑排序规则。