收录日期:2019/11/19 15:06:56 时间: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,可以得到同样的结果,而且又能解释的通,十分感谢。。。

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

一伙外地人在我们学校门口卖什么莲子桂花糕,说是八毛钱一两,一刀下去就是二斤,还不准退。我已经报警了,不知道后果如何,大家估计一下 有谁知道《思考机器》的是怎麽开发出来的,比如:将一个雷达与推进器相连该怎样编? 请问如何读取数据库中图片的大小(长,宽) 高手在那里?关于installshield的修复功能?(第二次提问了) 请问如何中断 internetreadfile? 怎么实现当鼠标停留在按钮上按钮的颜色会发生变化 好怪!! ASPX中怎么JS文件显示不了中文,而同样内容的ASP文件则可以?(高分) ???如何回车换行??? 高手请进!!在线等!!! 请问IntelliJ IDEA 的最新版本是多少?哪里有破解版下载? 请问如何阅读源代码较好? 300分!win9x串行通信的问题 请问IntelliJ IDEA 的最新版本是多少?哪里有破解版下载? 请问有本书是不是叫《C语言无忧出错指南》老外写的,请问哪有下载? #####100分求教获得当前系统地日期和时间用dao方法存入access数据库地方法###### windows程序设计中什么是色彩平面 为什么我按sun 的 petstore1.3.1中的指导来安装petstore 不成功? 用Javascript如何刷新页面,急救!!! 急,在IE里的串行口操作。 救命!!!!!!!!windows2000启动不了了 散分 又要用ORACLE数据库了,可否帮我推荐本比较好的书呢? 如何在程序动行时改变 Adodataset的locktype。 急!!!急需 Indy UDP 通讯的资料或者代码! 请问有本书是不是叫《C语言无忧出错指南》老外写的,请问哪有下载? 哪个网站有很多的控件下载? 如何把整数转换成字符型 请问ASP可以在数据库中动态生成表么? 底层开发和上层开发的含义?