MySQL中为何'a LIKE a'返回false?特殊字符串匹配异常求助
问题原因解析
这是因为MySQL里=和LIKE的匹配逻辑根本不一样:
=是纯精确字符串匹配:不管字符串里有啥字符,只要两个字符串字节完全一致就返回1,不会做任何特殊解析。LIKE是模式匹配:会把右侧的匹配模式里的特殊字符(通配符%、_,默认转义符\)当成特殊功能字符处理,而不是普通字符。
对应你的场景
你的第二个a值是\"(也就是反斜杠加双引号,SQL里要写成'\\"',你可能用HTML转义写成了'\"'):
a=a直接对比两个完全相同的字符串,自然返回1。a LIKE a的时候,右侧的匹配模式会被LIKE解析:模式里的\是默认转义符,会把后面的"转成普通字符——也就是说,实际用来匹配的模式变成了",但左边的字符串是\",两者不一样,所以返回0。
另外,如果a是单个反斜杠(SQL里写'\\'),a LIKE a也会返回0——因为模式串最后一个字符是转义符,MySQL会判定这是无效模式,匹配失败。
要让LIKE和=效果一致的办法
有两种方式:
- 显式指定一个不存在的字符当转义符,让LIKE把所有字符都当普通字符:
select a,a=a,a like a escape '#' from ( select '123' as a union all select '\\"' )x - 用
LIKE BINARY做二进制精确匹配,跳过模式解析:select a,a=a,a like binary a from ( select '123' as a union all select '\\"' )x
内容的提问来源于stack exchange,提问作者debugging
相关产品推荐
相关产品推荐

