Mysql like语句转义字符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql like语句转义字符相关的知识,希望对你有一定的参考价值。
直接在sql终端下敲的语句
要用like匹配到‘Root\Release System Testing\Wk03_2011\Functional R...‘ 居然需要写成’Root\\\\Release System Testing\\\\Wk03_2011\\\\%‘ 为何? 按照正常逻辑不是转义一次也就是把\ 写成 \\就可以了么?
如此一来直接导致我程序里的sql串写成16个\。。。 程序语言本身转义一次, 传给javascript还要转义一次。。 我勒个神嘞。。
问题关键就是为什么mysql要转义两次?
mysql> select * from users where user_firstname like '\\\\ff\\\\';
+---------+----------------+---------------+-----------+
| user_id | user_firstname | user_lastname | tester_id |
+---------+----------------+---------------+-----------+
| 23 | \ff\ | _ff_ | 4 |
+---------+----------------+---------------+-----------+
1 row in set (0.00 sec)
吖,以前我还没碰见过,为了这个问题,我还专门去看了一下手册,查询一个\,是必须用\\\\。
原文如下:
因为 MySQL 在字符串中使用的是 C 的转义句法(例如 “/n”),
所以在 LIKE 字符串中使用的任何一个 “/” 必须被双写。
例如,为了查找 “/n”,必须以 “//n” 形式指定它。为了查找 “/”,必须指定它为 “////”
(反斜线被语法分析器剥离一次,另一次在模式匹配时完成,留下一条单独的反斜线被匹配)。
mysql> SELECT * FROM `ta` WHERE `memo` = 'a//';
mysql> SELECT * FROM `ta` WHERE `memo` LIKE 'a////';
+----+------+
| id | memo |
+----+------+
| 1 | a/ |
+----+------+
# 在 LIKE 子句中,为了查找 “/”,必须指定它为 “////”
mysql> SELECT * FROM `ta` WHERE `memo` = 'a////';
mysql> SELECT * FROM `ta` WHERE `memo` LIKE 'a////////';
+----+------+
| id | memo |
+----+------+
| 2 | a// |
+----+------+
# 在 LIKE 子句中,为了查找 “/”,必须指定它为 “////”
mysql> SELECT * FROM `ta` WHERE `memo` = 'a//n';
mysql> SELECT * FROM `ta` WHERE `memo` LIKE 'a////n';
+----+------+
| id | memo |
+----+------+
| 3 | a/n |
+----+------+
# 在 LIKE 子句中,为了查找 “/”,必须指定它为 “////”
字符转移是递归处理的,看看:
原始:a////n
第一次 a//n
第二次 a/n
又如:a//////n
第一次 a////n
第二次 a//n
第三次 a/n
直到/没有可以匹配的转移字符为止。//,////这种情况会不停的转是因此/这个字符的二进制编码造成的。你可以说是bug,但是就是那么回事。
对/的处理要经过3次转义
这不符合编译原理啊。。 SQL语句应该是由sql server直接编译的,不会走到系统层 难道sql client 到sql server之间传递需要转义一次? 还是感觉不大对呢。。 因为转义[ _ 这些sql的正则元字符都只需单次转义。
比如我用like 匹配%ff% 只需 WHERE LIKE '\%__\%'
但是匹配\ff\时候必须WHERE LIKE ‘\\\\__\\\\’
而WHERE LIKE '\\__\\'是匹配不到的。。 百思不得其解。
MySQL之[NOT] LIKE
作用:模式匹配
%(百分号):代表任意个字符;
_(下划线):代表任意一个字符;
如果要在字符中对其进行转义,则在其前面多加一个
字符并ESCAPE掉即可。
例如:‘MAYU%‘ LIKE ‘%1%%‘ ESCAPE ‘1‘
表示以百分号结尾的字符:‘%1%‘ ‘%%1%‘
表示存在百分号的字符:‘%1%%‘
表示百分号在开头的字符:‘1%%‘
以上是关于Mysql like语句转义字符的主要内容,如果未能解决你的问题,请参考以下文章