暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

请注意前方高能有引号!

862

经常会碰到开发人员给出这样的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,但是从这个小小的功能,就可以看出数据库软件对待一些问题的处理上,存在不同的角度,另外会留出一些后门,避免特殊情况,这是在应用软件设计中,值得我们借鉴学习的。

                    最后修改时间:2020-03-09 14:57:50
                    文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论