前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >请注意前方高能有引号!

请注意前方高能有引号!

作者头像
bisal
发布2020-03-10 09:04:35
3840
发布2020-03-10 09:04:35
举报
文章被收录于专栏:bisal的个人杂货铺

经常会碰到开发人员给出这样的SQL脚本,如下所示,其中表名、字段名,都带了双引号,

代码语言:javascript
复制
SQL> create table "TESTA"
  2  ("ID" NUMBER,
  3   "NAME" VARCHAR2(1));
Table created.

P.S. 这种很可能是从测试库直接导出的。

我们说在一般情况下,Oracle对表名、字段名的大小写是不敏感的,换句话说,即使在SQL中用的小写表名、字段名,Oracle都会自动将他们转成大写,再存储到数据字典中,检索的时候,即使你用的小写,Oracle会自动将他们转成大写,再进行检索。

问题

但是,之所以说是“一般情况”,有前提的,就是表名、字段名,不会被引号包住,如上面这种写法,“TESTA”,其实就是大写敏感的,有什么区别么?                                               

实验

我们从实验看下,检索这张表,小写表名,但是不带引号,是可以找到的,

代码语言:javascript
复制
SQL> select * from testa;
no rows selected

但是当使用引号括起来的小写表名,就会提示ORA-00942,

代码语言:javascript
复制
SQL> select * from "testa";
select * from "testa"
              *
ERROR at line 1:
ORA-00942: table or view does not exist

这次,我们用引号括起小写表名,创建一张表,

代码语言:javascript
复制
SQL> create table "testb"
  2  ("id" number,
  3   "name" varchar2(1));
Table created.

此时无论使用不带引号的大写表名,还是不带引号的小写表名,都会提示找不到这张表,

代码语言:javascript
复制
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

只在使用引号括起来的小写表名时,才会找到这张表,

代码语言:javascript
复制
SQL> select * from "testb";
no rows selected

为了进行比对,我们再创建一张不带引号的“大写”表名和“小写”表名,

代码语言:javascript
复制
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是小写,其他都是大写,因此要是用引号,就需要注意大小写敏感,

代码语言:javascript
复制
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
TESTD
TESTC
testb
TESTA

同理,字段的大小写敏感,也是受到引号控制的,如下所示,如果不带引号,不会大小写敏感,带了就得区分大小写,

代码语言:javascript
复制
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,但是从这个小小的功能,就可以看出数据库软件对待一些问题的处理上,存在不同的角度,另外会留出一些后门,避免特殊情况,这是在应用软件设计中,值得我们借鉴学习的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 实验
  • 结论
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档