网站首页 > 技术文章 正文
无论测试或者开发,对数据库的增删改查都是家常便饭。但有些小知识是经常被忽略,却又不能不去了解的,例如单引号和双引号的用法和区别,看完这一篇,你肯定会有收获。
首先我们要区别一个概念,即单引号(‘)和双引号(“)和两个单引号(‘’),在PL/SQL中明显是不同的,单引号就是单引号,双引号就是双引号。那么我们来看下单引号和双引号在Oracle的世界中有什么区别。
Oracle中的单引号
在Oracle中,单引号主要有两种用途:
一是引用字符串
二是转义
让我们直接从问题出发,反向论证。
Q1 如何打印出单引号?
我们知道单引号经常用来标识内容为字符串(引用),但是怎么来标识自己呢?如果直接这样写,那么就会报错。
select ''' from dual;
> ORA-01756: 引号内的字符串没有正确结束
因此,这边用到了单引号的转义用法,即用单引号转义自己:’’
没错,就是写成两个单引号,转义类似语言中的反斜杠(\),下面SQL中的绿色部分就是转义的位置。
select''''fromdual;
Q2如果转义单引号和字符串的引号连续,如何选择优先级?
如果转义字符前后还有字符串,那么该怎么判断其优先级呢,是先表示字符串的,还是先转义。
select'name''is'fromdual;
例如上面这个SQL,两个字符串连在一起,那么是输出拼接后的nameis还是 name’is?其实这边看似两个字符串,其实中间的两个单引号是转义,所以结果是 name’is. select'name''is'fromdual;#中间引号为转义的单引号
那有没有连续转义的场景呢,例如下面这个sql,就是连续转义。
select'name'''''fromdual;
如上,sql中进行了连续两个转义,因此结果是name''
Q3单引号遇到||拼接还可以继续转义吗?
我们都知道,在sql语句中,如果想要多个字段拼接,可以用双竖线||来实现。而||两边的字符串是没有任何关联的,互不干扰,即使是转义字符也是一样的,可以看到下面这个例子。
select'I'||''''||'amJack'fromdual;
语句中由两个||将字符串分成了3部分,且每段都是互相独立的。那么中间4个单引号是如何显示的?其实是中间两个单引号是转义,前后两个单引号只是字符串的引用而已(4个单引号只为了显示1个单引号),因此结果就是:I'amJack
Q4单引号的转义太复杂,易混乱,有没有简单的标识方法?
对于简单的sql语句中含有个别单引号还可以接受,但是如果sql语句中包含大量的单引号,岂不是很混乱,要崩溃?
select'insertintobp_data_router(ACCESS_TYPE,ACCESS_CODE,BE_ID,EFF_DATE,CUST_ID_PREFIX,EXP_DATE,STATUS,CUST_ID)values('||''||t.access_type||','''||t.access_code||''','||t.be_id||',to_date('''||to_char(t.eff_date,'yyyymmddhh24miss')||''','||'''yyyymmddhh24miss''),'||t.cust_id_prefix||','||'to_date('''||to_char(t.exp_date,'yyyymmddhh24miss')||''','||'''yyyymmddhh24miss''),'''||t.status||''','||t.cust_id||');'frombp_data_routertwhereto_char(t.eff_date,'yyyymmddhh24miss')>'20170119004300'andt.eff_date<sysdate
对于类似复杂场景,为了避免出错,建议使用ASCII码来表示:chr(39)
selectchr(39)fromdual;#’
Oracle中的双引号
一般来说,双引号没有单引号那么复杂,它就是一个普通的字符。
select'"'fromdual;
但是,当出现在to_char的格式字符串中时,双引号有特殊的作用,就是将非法的格式符包装起来,避免出现ORA-01821:dateformatnotrecognized错误。?也就是说,去掉双引号和其包含的字符后,剩下的应该是一个合法的格式串。此时,to_char在处理格式字符串时,会忽略双引号。
selectto_char(sysdate,'hh24"小时"mi"分"ss"秒"')resultsfromdual;
如上这个写法,“小时”这部分是不能带入到语言内部运算的,程序会默认忽略这部分字符,但是输出的时候,又把它们加上,这就是双引号的作用。
#忽略之后执行这样的语句:
selectto_char(sysdate,'hh24miss')resultsfromdual;
#输出结果再加上双引号的格式:
>>22小时50分59秒
总结:
综上所述,Oracle中的单引号可以充当转义字符,且优先级较高,而双引号只是个普通字符,只有在to_char中才能发挥特别作用。
最后:
1)关注+私信回复:“测试”,可以免费领取一份10G软件测试工程师面试宝典文档资料。
2)关注+私信回复:"入群" 就可以邀请你进入软件测试群学习交流~~
猜你喜欢
- 2024-11-16 Java知识体系最强总结(2021年最新版)
- 2024-11-16 从 Java 12 到 Java 17 的新特性(java的什么特性实现了软件开发人员一次编写)
- 2024-11-16 近期CTF热点,建议收藏(近期ctf比赛)
- 2024-11-16 讲解JDK从8以后(包含8)各个版本的各种新特性
- 2024-11-16 开源OWASP CRS规则(开源scara)
- 2024-11-16 科普基础 | 最全的SQL注入总结(sql注入百度百科)
- 2024-11-16 MySQL高级篇-彻底掌握存储过程和函数
- 2024-11-16 第六天二次注入sqlmap简单参数(sqlmap注入攻击实例)
- 2024-11-16 存储过程与函数(存储过程与函数的区别)
- 2024-11-16 数据变更抓取利器Databus架构分析与初步实践
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 605℃几个Oracle空值处理函数 oracle处理null值的函数
- 597℃Oracle分析函数之Lag和Lead()使用
- 585℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 581℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 576℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 570℃【数据统计分析】详解Oracle分组函数之CUBE
- 557℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 550℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)