Oracle被大众所知的是对大小写不敏感,当你使用小写SQL语句创建表,表名和字段都会变成大写,在查询或更新表时无论你是小写还是大写表名和字段名都能正确执行。但是,在加入双引号之后情况就有所变化了。
莫名的问题
一切莫名的问题都源于你对问题背后原因的不了解。在有一次使用Navicat Oracle可视化工具创建了一张测试表后,表名是小写的test
,接着莫名的问题发生了,在查询时死活报错“ORA-00942:table or view does not exist”,查询语句如下:
1 | select * from test; |
经过一番折腾后面想到Navicat工具的SQL会将所有表名和字段加上双引号,于是尝试使用这样的SQL:
1 | select * from "test"; |
居然执行成功了!!!
分析
Oracle默认是大小写不敏感,表名、字段名等不区分大小写,小写会自动转换为大写;在使用了双引号之后则变成了对大小写敏感,不会自动转换为大写了。
了解到这一点之后,我们在来看在执行select * from test;
时,对Oracle来说执行的是SELECT * FROM TEST
,而我们在使用Navicat可视化工具建表时其实表名会加上双引号即create table "test"…
这样的,也就是在Oracle中只有小写的test表,自然会报表不存在的错了。
当在查询语句上也加上双引号select * from "test;"
时,对Oracle来说执行的是SELECT * FROM test
了,因为在双引号中的表名不会再被转换了,SQL必然是能顺利执行了。
字段名加双引号也会是同样的效果,一般情况我们手写SQL也不会加双引号,不清楚Navicat为什么要这样做。