MySQL字符串函数中反斜杠(\)无法正常使用的技术求助
这问题我之前踩过好几次坑!核心原因是MySQL默认把反斜杠()当作转义字符,你直接写单个\的时候,它会被用来转义后面的字符,而不是作为一个普通的匹配字符存在。比如你写的语句里:
SELECT LOCATE("", "Schools.co\m", 1) AS MatchPosition;
这里的第一个"\"其实是转义了后面的双引号,实际传递给LOCATE的匹配字符串是空的,自然找不到位置;第二个语句里的"footba\l"会被解析成"footbal",分隔符同样被转义成空,结果肯定不对。
下面给你几个可行的解决方案:
使用双反斜杠(\)代替单个反斜杠
这是最直接的方法,MySQL会把连续两个反斜杠解析成一个实际的\字符。把你的语句改成这样就能得到预期结果:SELECT LOCATE("\\", "Schools.co\\m", 1) AS MatchPosition; SELECT SUBSTRING_INDEX("footba\\l","\\",1);变量赋值的时候同理,比如
SET @my_str = 'test\\demo';会得到test\demo的字符串。修改SQL模式禁用反斜杠转义
如果觉得双反斜杠写起来麻烦,可以临时设置会话级的sql_mode,关闭反斜杠转义功能:SET sql_mode = 'NO_BACKSLASH_ESCAPES';设置之后,单个\就会被当作普通字符处理,你的原语句就能正常执行了。要是想让这个设置永久生效,需要修改MySQL配置文件(my.cnf或my.ini)里的sql_mode参数,添加
NO_BACKSLASH_ESCAPES,然后重启服务。注意外部输入的转义处理
如果你是从应用程序(比如Java、PHP)传入包含反斜杠的字符串,还要注意应用层本身的转义规则,比如Java里字符串的\也要用\表示,确保最终传递给MySQL的是正确的转义后的字符串。
内容的提问来源于stack exchange,提问作者Spring98

