经常会碰到开发人员给出这样的SQL脚本,如下所示,其中表名、字段名,都带了双引号,
SQL> create table "TESTA"
2 ("ID" NUMBER,
3 "NAME" VARCHAR2(1));
Table created.
P.S. 这种很可能是从测试库直接导出的。
我们说在一般情况下,Oracle对表名、字段名的大小写是不敏感的,换句话说,即使在SQL中用的小写表名、字段名,Oracle都会自动将他们转成大写,再存储到数据字典中,检索的时候,即使你用的小写,Oracle会自动将他们转成大写,再进行检索。
问题
但是,之所以说是“一般情况”,有前提的,就是表名、字段名,不会被引号包住,如上面这种写法,“TESTA”,其实就是大写敏感的,有什么区别么?
实验
我们从实验看下,检索这张表,小写表名,但是不带引号,是可以找到的,
SQL> select * from testa;
no rows selected
但是当使用引号括起来的小写表名,就会提示ORA-00942,
SQL> select * from "testa";
select * from "testa"
*
ERROR at line 1:
ORA-00942: table or view does not exist
这次,我们用引号括起小写表名,创建一张表,
SQL> create table "testb"
2 ("id" number,
3 "name" varchar2(1));
Table created.
此时无论使用不带引号的大写表名,还是不带引号的小写表名,都会提示找不到这张表,
SQL> select * from TESTB;
select * from TESTB
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> select * from testB;
select * from testB
*
ERROR at line 1:
ORA-00942: table or view does not exist
只在使用引号括起来的小写表名时,才会找到这张表,
SQL> select * from "testb";
no rows selected
为了进行比对,我们再创建一张不带引号的“大写”表名和“小写”表名,
SQL> create table TESTC
2 (id number,
3 name varchar2(1));
Table created.
SQL> create table testd
2 (id number,
3 name varchar2(1));
Table created.
通过user_tables视图,就可以看到这个表名的真实存储,除了testb是小写,其他都是大写,因此要是用引号,就需要注意大小写敏感,
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
TESTD
TESTC
testb
TESTA
同理,字段的大小写敏感,也是受到引号控制的,如下所示,如果不带引号,不会大小写敏感,带了就得区分大小写,
SQL> select id, name from "testa";
select id, name from "testa"
*
ERROR at line 1:
ORA-00904: "NAME": invalid identifier
SQL> select "id", "name" from "testa";
no rows selected
结论
虽然,Oracle中支持通过引号实现表名、字段名的大小写敏感,但是不推荐,毕竟每次使用都要带着引号,使用起来麻烦,而且很容易混淆,例如有些厂商写的配置表名和字段都用的小写,导致程序中一旦没用引号括起来的小写名,就会提示ORA-00942的错误,当然,凡事两面看,使用引号大小写敏感的,某些情况下可以保护数据结构被篡改,例如一些重要的配置表,可以使用引号小写表名,一般人写SQL不会找到他。
不同的数据库,对待大小写敏感可能是不同的,以上的情况只是针对Oracle,但是从这个小小的功能,就可以看出数据库软件对待一些问题的处理上,存在不同的角度,另外会留出一些后门,避免特殊情况,这是在应用软件设计中,值得我们借鉴学习的。