查看: 19949|回复: 10

[笔记] 单引号双重角色——字符串引用与转义小结

[复制链接]
招聘 : 数据库开发
论坛徽章:
29
秀才
日期:2015-12-14 14:47:54秀才
日期:2015-11-12 17:43:40秀才
日期:2015-11-11 10:22:49秀才
日期:2015-11-11 09:58:34秀才
日期:2015-10-26 09:24:12秀才
日期:2015-09-21 11:16:42秀才
日期:2015-12-14 14:51:16秀才
日期:2015-12-14 14:56:09秀才
日期:2015-11-23 09:48:22ITPUB14周年纪念章
日期:2015-10-26 17:23:44
跳转到指定楼层
1#
发表于 2006-11-29 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人在做项目维护的时候,遇到了开发人员遗留下来的大量动态SQL,很是发了一段时间来弄明白单引号的双重角色。现做如下总结,即使在各位高手面前班门弄斧,由希望能给与我同样被单引号双重角色迷惑的同仁们有所帮助!
     在oracle中,字符串是由单引号引用的,而转义也是由单引号来完成的,这对于许多初学者而言是件头疼的事情,尤其是开始学习动态SQL的人。如果就单纯的单引号而言,很容易让人理解:它总是找与它最近的一个单引号配对。也就是所谓的就近原则;但是在单引号充当转义角色的时候,情况就显得有些让人费解了。(为方便起见,红色单引号都是充当转义角色)
   1、从第二个单引号开始被视为转义符,如果第二个单引号后面还有单引号(哪怕只有一个)。
[php]
[/COLOR]
SQL> select '''' from dual;

''
--
'
[/php]
  为了证实结果是被第二个单引号转义的第三个单引号(既:select ''[/COLOR]'' from dual;),我们做如下两个测试:
[php]
SQL> select ''' from dual;
ERROR:
ORA-01756: 括号内的字符串没有正确结束

[/php]

相信大家对这样的错误不陌生吧
[php]
SQL> select 'sdlf from dual;
ERROR:
ORA-01756: 括号内的字符串没有正确结束

[/php]
   也就是说,当第二个单引号充当转义角色,第三个单引号被转义,(既:select ''[/COLOR] ' from dual;)自然就缺少与第一个单引号匹配的单引号了,出现了孤立的单引号
下面的两个实验就更加支持了上面的结论。
[php]
SQL> select ' '' ' from dual;

''''
------
'

SQL> select '' '' from dual;
select '' '' from dual
          *
ERROR 位于第 1 行:
ORA-00923: 未找到预期 FROM 关键字

[/php]

对于第一个:select ' '[/COLOR]' ' from dual;
对于第二个:不存在转义。

上面的这两个实验其实也是单引号转义与非转义的一个性质:转义是密集的,也就是说,如果单引号出现在转义的位置上,而该单引号后面紧跟(紧跟的定义为:两个单引号之间是零距离的)的不是单引号,这个时候单引号就不在充当转义的角色,而是与它前面的配对。[/COLOR]

2、连接符‘||’导致了新一轮的转义:连接符号‘||’左右的单引号没有任何的关系,除非‘||’是作为字符串的一部分(这在动态SQL中很常见)。
[/COLOR]
[php]
SQL> select 'exit'||'''' from dual;

'EXIT'||''
----------
exit'

SQL> select 'exit''''' from dual;

'EXIT'''''
------------
exit''

[/php]
对于第一个,前两个单引号配对,后面四个单引号按照上面的第一条原则分配,既:select 'exit'||''[/COLOR]'' from dual;
对于第二个,由于第二个单引号后面存在单引号,所以就不与第一个配对,而是充当了转义的角色。既:select 'exit'[/COLOR]''[/COLOR]'' from dual;

有了上面的两条原则,我们就可以从容的面对复杂的动态SQL了。
'[/COLOR]
论坛徽章:
85
2008新春纪念徽章
日期:2008-02-13 12:43:03双黄蛋
日期:2011-06-17 11:07:502011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-04 10:24:022010年世界杯参赛球队:荷兰
日期:2010-08-28 00:09:112010年世界杯参赛球队:科特迪瓦
日期:2010-03-02 12:36:542010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:意大利
日期:2009-12-31 14:41:24
2#
发表于 2006-11-30 11:21 | 只看该作者
应该是内部的两个 ''  合在一起表示转义

使用道具 举报

回复
论坛徽章:
0
3#
发表于 2006-11-30 13:32 | 只看该作者
不错,顶

使用道具 举报

回复
论坛徽章:
9
茶鸡蛋
日期:2011-12-28 08:44:392012新春纪念徽章
日期:2012-01-04 11:49:54优秀写手
日期:2013-12-18 09:29:152014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
4#
发表于 2006-11-30 14:28 | 只看该作者
呵呵,同感。对单引号的转义功能确实感到比较头疼。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-12-01 16:15:06
5#
发表于 2006-12-1 11:56 | 只看该作者
原来如此。

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
6#
发表于 2006-12-1 13:37 | 只看该作者
看过~

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
29
秀才
日期:2015-12-14 14:47:54秀才
日期:2015-11-12 17:43:40秀才
日期:2015-11-11 10:22:49秀才
日期:2015-11-11 09:58:34秀才
日期:2015-10-26 09:24:12秀才
日期:2015-09-21 11:16:42秀才
日期:2015-12-14 14:51:16秀才
日期:2015-12-14 14:56:09秀才
日期:2015-11-23 09:48:22ITPUB14周年纪念章
日期:2015-10-26 17:23:44
7#
 楼主| 发表于 2006-12-1 19:33 | 只看该作者
哈哈
第一次发这样的帖子
估计太没有技术含量了
以后保证改正
呵呵!

使用道具 举报

回复
论坛徽章:
0
8#
发表于 2006-12-22 08:19 | 只看该作者
我也是常被四个单引号放在一起而很难看懂
谢谢了
顶下吧

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
29
秀才
日期:2015-12-14 14:47:54秀才
日期:2015-11-12 17:43:40秀才
日期:2015-11-11 10:22:49秀才
日期:2015-11-11 09:58:34秀才
日期:2015-10-26 09:24:12秀才
日期:2015-09-21 11:16:42秀才
日期:2015-12-14 14:51:16秀才
日期:2015-12-14 14:56:09秀才
日期:2015-11-23 09:48:22ITPUB14周年纪念章
日期:2015-10-26 17:23:44
9#
 楼主| 发表于 2006-12-22 10:46 | 只看该作者
自己再顶一下
哈哈

使用道具 举报

回复
论坛徽章:
2
一汽
日期:2013-08-09 23:59:24优秀写手
日期:2013-12-18 09:29:13
10#
发表于 2013-8-13 14:42 | 只看该作者
解决了难题,多谢楼主,收藏

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表