收录日期:2020/06/01 02:39:02 时间:2016/07/26 19:55:52 标签:MySQL
Ronaldo09 于 2010-09-08 18:52:48 编辑 记录字段中有 \

钢笔 78\9 \
钢笔 45\\6


想做一个能对转义符号 \ 的查询

认为查询一个转义字符 \ 的sql
select * from tmp where ms like '%\\%'

却没有结果。

认为查询相连转义字符 \\ 的sql
select * from tmp where ms like '%\\\\%'

俩个记录都出来

发现用7个\
select * from tmp where ms like '%\\\\\\\%'

能查询出第二个记录

发现用3个%\\\% 和用4个%\\\\%,结果一样,俩个记录都出来
发现用5或6个 %\\\\\% %\\\\\\%,结果一样,无返回结果

研究了mysql的通配符和转义字符,还有regexp,都搞不明白,头很大。

求高人指点。。。
十分感谢

你的具体问题是什么?

MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
mysql> select * from tb ;
+-------------+
| col         |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)

mysql> select * from tb where col like '%?\%' escape '?';
+-------------+
| col         |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)
 十分感谢

官方文档我也看了,里面关于转义字符讲的不多,说的无非是对 % _ 一些转义,对\转义也是用\\

我的目的是,想查询包含 \ 或者 \\ 的记录,
但是用 %\\% 或者%\\\\%,查询,貌似不是很灵,而且\ 和 %绞在一起,比较麻烦

想寻求一个查询包含 \ 或者 \\ 记录的方法
引用 3 楼 ronaldo09 的回复:
十分感谢

官方文档我也看了,里面关于转义字符讲的不多,说的无非是对 % _ 一些转义,对\转义也是用\\

我的目的是,想查询包含 \ 或者 \\ 的记录,
但是用 %\\% 或者%\\\\%,查询,貌似不是很灵,而且\ 和 %绞在一起,比较麻烦

想寻求一个查询包含 \ 或者 \\ 记录的方法

2L.
引用 2 楼 feixianxxx 的回复:
SQL code
mysql> select * from tb ;
+-------------+
| col         |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)

mysql> select * from tb where col lik……


十分感谢,自定义转义字符我也试了,但是要查询 \\,怎么写呢,%?\?\%,我试了下,没有结果
我又试了下,有如下记录

mysql> select ms from tmp where ms like '%?%';
+-----------+
| ms      |
+-----------+
| 钢笔 99?9 | 
| 钢笔 8??8 | 
+-----------+


匹配一个通配符?
mysql> select ms from tmp where ms like '%??%' escape '?';
+-----------+
| ms      |
+-----------+
| 钢笔 99?9 | 
| 钢笔 8??8 | 
+-----------+
2 rows in set (0.00 sec)


匹配俩个??
mysql> select ms from tmp where ms like '%????%' escape '?';
+-----------+
| ms      |
+-----------+
| 钢笔 8??8 | 
+-----------+
1 row in set (0.00 sec)


自定义转义符,就是我想要的结果
但是自定义转义符对\,结果又不是想象的那样 ?\?\

没有很好的办法解决, \\ 转义字符的查询麽?
mysql> select * from t_Ronaldo09
    -> ;
+-------------+
| id          |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
| 钢笔 99?9   |
| 钢笔 8??8   |
+-------------+
4 rows in set (0.02 sec)

mysql> select * from t_Ronaldo09 where instr(id ,'\\');
+-------------+
| id          |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)

mysql> select * from t_Ronaldo09 where instr(id ,'\\\\');
+-------------+
| id          |
+-------------+
| 钢笔 45\\6  |
+-------------+
1 row in set (0.00 sec)

mysql> select * from t_Ronaldo09 where instr(id ,'?');
+-----------+
| id        |
+-----------+
| 钢笔 99?9 |
| 钢笔 8??8 |
+-----------+
2 rows in set (0.00 sec)

mysql> select * from t_Ronaldo09 where instr(id ,'??');
+-----------+
| id        |
+-----------+
| 钢笔 8??8 |
+-----------+
1 row in set (0.00 sec)

mysql>
mysql> select * from t_Ronaldo09 where id regexp '[\\]';
+-------------+
| id          |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)

mysql>
mysql> select * from t_Ronaldo09 where id regexp '[\\][\\]';
+-------------+
| id          |
+-------------+
| 钢笔 45\\6  |
+-------------+
1 row in set (0.00 sec)

mysql>
mysql> select * from t_Ronaldo09 where id regexp '[?]';
+-----------+
| id        |
+-----------+
| 钢笔 99?9 |
| 钢笔 8??8 |
+-----------+
2 rows in set (0.00 sec)

mysql>
mysql> select * from t_Ronaldo09 where id regexp '[?][?]';
+-----------+
| id        |
+-----------+
| 钢笔 8??8 |
+-----------+
1 row in set (0.00 sec)

mysql>
mysql> select * from t_Ronaldo09 where id like '%\\\\%';
+-------------+
| id          |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)

mysql> select * from t_Ronaldo09 where id like '%\\\\\\\\
+-------------+
| id          |
+-------------+
| 钢笔 45\\6  |
+-------------+
1 row in set (0.00 sec)

mysql> select * from t_Ronaldo09 where id like '%?%';
+-----------+
| id        |
+-----------+
| 钢笔 99?9 |
| 钢笔 8??8 |
+-----------+
2 rows in set (0.02 sec)

mysql> select * from t_Ronaldo09 where id like '%??%';
+-----------+
| id        |
+-----------+
| 钢笔 8??8 |
+-----------+
1 row in set (0.00 sec)

mysql>
经过自己的反复试验,对于连续的转义字符\\....
得到如下结论


要匹配的连续\个数 %\\\..%模式匹配中\的个数
1 3
2 7
3 11
数学归纳猜想 n*3+n-1=4n-1
验证
4 15
5 19



mysql> SELECT ms from tmp where ms like '%\\\%';
+-----------------------+
| ms                  |
+-----------------------+
| 单面刀片 飞鹰 20片\盒 | 
| 钢笔 1\2\\3 \\        | 
| 钢笔 45\\6            | 
| 钢笔 78\9 \           | 
| 钢笔 77\\\7           | 
| 钢笔 66\\\\6          | 
| 钢笔 55\\\\\5         | 
+-----------------------+
7 rows in set (0.00 sec)

mysql> SELECT ms from tmp where ms like '%\\\\\\\%';
+----------------+
| ms           |
+----------------+
| 钢笔 1\2\\3 \\ | 
| 钢笔 45\\6     | 
| 钢笔 77\\\7    | 
| 钢笔 66\\\\6   | 
| 钢笔 55\\\\\5  | 
+----------------+
5 rows in set (0.00 sec)

mysql> SELECT ms from tmp where ms like '%\\\\\\\\\\\%';
+---------------+
| ms          |
+---------------+
| 钢笔 77\\\7   | 
| 钢笔 66\\\\6  | 
| 钢笔 55\\\\\5 | 
+---------------+
3 rows in set (0.00 sec)

mysql> SELECT ms from tmp where ms like '%\\\\\\\\\\\\\\\%';
+---------------+
| ms          |
+---------------+
| 钢笔 66\\\\6  | 
| 钢笔 55\\\\\5 | 
+---------------+
2 rows in set (0.00 sec)

mysql> SELECT ms from tmp where ms like '%\\\\\\\\\\\\\\\\\\\%';
+---------------+
| ms          |
+---------------+
| 钢笔 55\\\\\5 | 
+---------------+
1 row in set (0.00 sec)


问题已经解决,但是不知道为什么,希望高人指点,十分感谢
引用 9 楼 acmain_chm 的回复:
SQL code
mysql> select * from t_Ronaldo09 where id regexp '[\\]';
+-------------+
| id          |
+-------------+
| 钢笔 789 \a |
| 钢笔 45\\6  |
+-------------+
2 rows in set (0.00 sec)

mysql>……


十分感谢版主,用regexp确实方便很多,我查到手册上有这么一句
注释:由于在字符串中, MySQL使用 C 转义语法 (例如, 用‘\n’来代表换行字符 ),在REGEXP字符串中必须将用到的‘\’ 双写。


这下豁然了,但是对于 like 用 4n-1 还是很想知道究竟,呵呵

mysql> select * from t_Ronaldo09 where id like '%\\\\\\\\%';
+-------------+
| id          |
+-------------+
| 钢笔 45\\6  |
+-------------+
1 row in set (0.00 sec)


以这个来分析

 id like '%\\\\\\\\%';

首先你的命令行会把这个 '%\\\\\\\\%'; 解释成 '%\\\\%'; 提交到服务器端。

然后在LIKE运算的的时候 '%\\\\%';会变成 '%\\%';
版主很强大...
引用 13 楼 acmain_chm 的回复:
SQL code
mysql> select * from t_Ronaldo09 where id like '%\\\\\\\\%';
+-------------+
| id          |
+-------------+
| 钢笔 45\\6  |
+-------------+
1 row in set (0.00 sec)


以这个来分析

 id li……


版主V5,找到比较合理的解释,而且我试了下,4n-1,修正为 4n,可以得到同样的结果,而且又能解释的通,十分感谢。。。

版主真是强大。。。呵呵,谢谢了。。。

请教高手关于线程安全的问题,我已经有好几个问题无人解决了!! .NET的例子scribble 为何在我的.NET2003里面出问题? 求解!!!(复选框) [急求!]一段JAVA小程序!!快!!!!!!!!!!!!!!!! 关于Servlet和JavaBean的路径问题!急! 心急如焚:针对.DBF数据库的程序,在Windows2000上编译成功的程序,在WindowsXP上居然无法运行 一个Visual Studio.Net 2003设置问题! 这个语句怎么实现呀 在网上做什么最赚钱! 怎样向一个框架页面提交数据 启动脚本的问题 抉择--请大家给我一点意思 郁闷,关于JDBC的问题!!跪求高手。。。。。。 100多兆的一个图片想往 sql 里面放怎么弄阿? BMP插入记录不能提交-100分 急用!!!!!!! [深圳]我公司招聘美工(主要)+.NET程序员(次要) 大家帮帮我,菜鸟吐血求助:servlet调用jsp页面参数求助!! 怎样在一个已做好的导航flash中加超连接? 源代码打包下载 如何编写程序,修改网卡MAC地址啊? 刚刚新建的一个项目的Form1是一个实例还是一个类? 这个工作跟从事单片机开发类的工作有多大的差距???????? 关于全码,有一个例题看不懂,请教啦 请教一个串口通信程序 动态ip如何设服务器呢?麻烦一问? 有谁用jb9开发过struts的tiles的吗?有请进,问个问题,麻烦:) 2001的2001次方是多少位? 如何编写程序,修改网卡MAC地址啊? Indy组建—IdHTTPServer的多线程问题