问题背景
今天数据库老师留了一道实验题,如下:
(14)查询“A _ C”课程的课程号和学分。(如果没有“A _ C”这么课,在course表中补上这门课, “ABC” “ACC” 等课程查不出来)
我的DBMS是MySQL,数据库管理工具为Navicat
一开始,我是按照书上的知识点去敲得:
如果用户要查询的字符串本身就含有通配符 % 或 _ ,这时就需要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义了。
ESCAPE ’ \ ’ 表示 “ \ ” 为换码字符。这样匹配字符串中紧跟在 “ \ ” 后面的字符 “ _ ” 不再具有通配符的含义,转义为普通的 “ _ ” 字符。
代码如下:
select Cno,Ccredit from course where Cname like 'A\_C' escape '\';
数据库中的表格如下:
查询结果如下:
不仅如此,还会对后面的代码片产生影响:
当时我的心情
问题提出
1.为什么书上的这种方法得不到正确的数据呢?
首先,从代码片分析, \ 后面的代码都变成了字符串形式,说明 \ 将后面的 ’ 转义成为了普通字符,所以会报错。
然后,我又去MySQL的官网上查了一下MySQL 8.0参考手册,进入MySQL 8.0 Reference Manual --> Functions and Operators --> String Functions and Operators --> String Comparison Functions and Operators
有这么一段话:
百度翻译之后,得出:
要测试通配符的文字实例,请在其前面加上转义符。如果未指定ESCAPE字符, \则假定为。
也就是说,不声明的情况下 \ 默认为是转义字符,所以不再需要escape短语将其转化为换码字符。
2.是因为DBMS的问题嘛?
关于这个问题 ,我去找我的同学试了试SQL Server,结果让我很痛心
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)