Oracle双引号和单引号的区别小结

2024-11-30 00:55:42
推荐回答(1个)
回答1:

  一般情况下,我们使用单引号居多。但在字符集不一致的时候,双引号和单引号区别还是很大的而且,使用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