Oracle和Linux关于双引号、单引号的知识点小结
2012-12-20 18:01
399 查看
一般情况下,我们使用单引号居多
但在字符集不一致的时候,双引号和单引号区别还是很大的
而且,使用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中,无论单引号、双引号,均表示字符串
但在字符集不一致的时候,双引号和单引号区别还是很大的
而且,使用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中,无论单引号、双引号,均表示字符串
相关文章推荐
- Linux下安装Oracle的过程和涉及的知识点-系列4
- 关于oracle递推查询的一点知识点说明
- linux中关于目录的几个特殊知识点-
- oracle事务知识点小结
- Linux下关于文件&&目录操作的命令小结
- linux下关于后台任务和前台任务之间的且切换命令小结
- linux中关于磁盘操作工具fdisk|parted|mk2fs|mke2fs|fsck|badblocks的使用小结
- linux下关于vim的一些小知识点总结
- 关于Linux x64 Oracle JDK7u60 64-bit HotSpot VM 线程栈默认大小问题的整理
- Linux知识点小结
- 关于linux下安装oracle的raw device
- Oracle在Linux下地安装小结
- [RK3288][Android6.0] 关于uboot中logo相关知识点小结
- 关于Linux AT&T Asm的零星小结
- Linux下安装Oracle的过程和涉及的知识点-系列6
- Linux下安装Oracle的过程和涉及的知识点-系列1
- Linux期末复习知识点小结(六)——线程与进程通信之管道通信概念
- [RK3288][Android6.0] 关于uboot中logo相关知识点小结【转】
- 关于plsql中的define变量以及Oracle变量分类小结
- 关于Linux AT&T Asm的零星小结