`
sjk2013
  • 浏览: 2177446 次
文章分类
社区版块
存档分类
最新评论

Oracle和Linux关于双引号、单引号的知识点小结

 
阅读更多

一般情况下,我们使用单引号居多
但在字符集不一致的时候,双引号和单引号区别还是很大的
而且,使用ODBC桥导入外部数据的时候,表名是带双引号的

先看个案例:
以前遇到过一个这样的问题
一个朋友在创建表时,表名采用小写,并且表名用双引号括了起来
表已经创建了,但是在查询的时候,显示表名不存在,可在user_tables又能看到这张表
观察得出,加了双引号的小写表名存入数据库后也是小写
用双引号扩起来的标识符都作为原来的大小写格式存放在数据字典中
而Oracle在调用时,默认的使用大写格式去数据字典中查询
以列名为例:

sys@EMREP> create table test(a varchar2(10), a varchar2(10));

create table test(a varchar2(10), a varchar2(10))
                                  *
ERROR at line 1:
ORA-00957: duplicate column name
sys@EMREP> create table test("a" varchar2(10), a varchar2(10));

Table created.

sys@EMREP> SELECT table_name, column_name FROM user_tab_cols WHERE table_name = 'TEST';

TABLE_NAME                     COLUMN_NAME
------------------------------ ------------------------------
TEST                           a
TEST                           A
sys@EMREP> insert into test values ('1','1');

1 row created.

sys@EMREP> commit;

Commit complete.

sys@EMREP> select * from test;

a          A
---------- ----------
1          1
  以大写方式存在数据字典中,验证一下:
sys@EMREP> create table test_xxxx(a varchar2(1), "A" varchar2(1));
create table test_xxxx(a varchar2(1), "A" varchar2(1))
                                      *
ERROR at line 1:
ORA-00957: duplicate column name


双引号括起来的更确切一点叫 "引证标识符"
比如我们创建一张表,我们在写CREATE语句的时候,就算表名用小写,数据字典里存储的所有标识符还是大写的
但是要想在数据字典里存储小写的标识符,那写CREATE语句的时候就得用双引号
所以要标识符区分大小写,或在标识符中包含空格,或者使用保留字做标识符,就得用双引号括起来的引证标识符

双引号:
① 表示其内部的字符串严格区分大小写
② 用于特殊字符或关键字
③ 不受标识符规则限制
④ 会被当成一个列来处理
⑤ 当出现在to_char的格式字符串中时,双引号有特殊的作用,就是将非法的格式符包装起来
避免出现ORA-01821: date format not recognized错误, to_char在处理格式字符串时,会忽略双引号

sys@EMREP> select to_char(sysdate, 'hh24"小时"mi"分"ss"秒"') AS RESULT from dual;

RESULT
------------------
17小时31分30秒


单引号:
① 表示字符串常量
② 字符串中的双引号仅仅被当作一个普通字符进行处理。此时,双引号不需要成对出现
例如:

sys@EMREP> select 'hh24"小时""mi"分"""ss"秒"' AS RESULT from dual;

RESULT
-----------------------------
hh24"小时""mi"分"""ss"秒"


③ 动态SQL:
在一对单引号包含的语句中,必须有一对相邻的单引号表示一个单引号
两个相邻的单引号的作用,第一个是用来表示转义字符,后面一个表示真正的单引号
单引号里要用单引号应该是两个连续的单引号,而不是双引号
例如:

select 'alter system kill session ''''|| sid||','||serial#|| '''';' from v$session


我们在linux shell编程时
在设置变量的时候,可借用双引号或单引号来控制,单引号与双引号必须成对
若是单引号,则其内的特殊字符仅为一般字符
若是双引号,则其内的特殊字符,如$,可以保有原本的特性。如,var=“lang is $LANG",则echo $var,可得 lang is en_US

[root@localhost ~]# name=think
[root@localhost ~]# echo $name
think
[root@localhost ~]# ename="$name is my English name"
[root@localhost ~]# echo $ename
think is my English name
[root@localhost ~]# ename='$name is my English name'
[root@localhost ~]# echo $ename
$name is my English name


在Oracle中只有单引号才表示字符串,但在Linux中,无论单引号、双引号,均表示字符串

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics