Oracle之表、字段大写问题

先写结论:如果在Oracle中的对象是区分大小写的,那么SELECT必须加双引号。

由于刚使用 ORACLE ,没有想到它有一些奇奇怪怪的特质,并非贬义。也许就像我吃惯了川菜,浙菜虽有其风味,但还是令人我想念家乡的味道。

用惯SQL Server,刚开始用 ORACLE 肯定不大习惯。SQL Server数据库是不转换为大写,但是使用时并不区分大小写。而 ORACLE 建的表名和字段名会自动为转换为大写。甚至会因为这一点感到有些恼火。因为不知道这一点,但又出了错误,根本无从检查。。。

我会从 ORACLE 官方的默认配置,以及误区,和个人考虑三个方面来解释这个问题。

默认配置

因为 ORACLE 在建表/字段时,如果没有双引号, ORACLE 会把表名、字段名全部转化为大写字母,然后写入数据字典。访问数据字典时,没有双引号 ORACLE 会将其转化成大写然后再去数据字段中查找。不仅仅关键字不区分大小写,函数名,过程名,表名称,pl/sql块中变量名,用户名,密码等都不区分大小写[1]

误区

可能很多人都会误认为 ORACLE 是不区分大小写的,原因是我们在写查询语句的时候,大小写无所谓,结果都是一样的,这只是个表面现象。因为只要你不使用双引号表示区分大小写, ORACLE 会默认把你写的脚本全部转换为大写的。

例如:如果创建表使用如下语句:

create table "TaBlE_NaMe"(blah..)

那么必须在SELECT中使用双引号才能返回预期结果。

如果创建表使用:

create table TaBlE_NaMe (blah..)

没有引号的SELECT也应该能返回预期结果[2]

个人考虑

我也在想这些,官方推荐的大写是否是因为大小写对SQL执行快慢有影响?

但有网上大神提到:“任何的语言都需要进行词法和语法分析,经过oracle的词法分析,本身就会将小写转成大写,所以这个无关sql的执行效率问题,只是减少了编译过程的时间而已。”

但我觉得这条也挺好:“斤斤计较这个没什么必要,即使多执行一条功能相同的语句也是非常快的,关键是处理大数据量的时候的性能优化(这问题很广,网上有很多建议都可以看看),这个比较重要。”

我认为,就只当是单纯的数据库差异来看比较好。

[1] http://www.cnblogs.com/kerrycode/archive/2011/05/05/2037151.html ORACLE 对象大小写问题

[2] https://stackoverflow.com/questions/31569953/why-does-ORACLE -12c-query-require-double-quotes-around-table/31572872#31572872 Whydoes  ORACLE  12c query require double quotes around table[duplicate]

原文地址:https://www.cnblogs.com/Sherlock-J/p/12926005.html