代码之家  ›  专栏  ›  技术社区  ›  George Mauer

表名周围的引号具体做什么?

  •  43
  • George Mauer  · 技术社区  · 16 年前

    我以为引号(“)只是一种分组标记,但我正在调试一些非特定代码,并注意到

    SELECT * FROM site WHERE site_id = 3;
    

    工程罚款

    SELECT * FROM "site" WHERE site_id = 3;
    

    失败,表或视图不存在错误。

    给出了什么?

    2 回复  |  直到 8 年前
        1
  •  84
  •   Justin Cave    16 年前

    在Oracle中,在标识符周围加双引号会导致Oracle将标识符视为区分大小写,而不是使用默认的不区分大小写。如果在名称周围创建带双引号的表(或列),则必须始终使用双引号引用标识符,并正确指定大小写(所有大写标识符除外,其中双引号没有意义)。

    在封面下,Oracle总是进行区分大小写的标识符匹配。但在进行匹配之前,它总是将不带双引号的标识符强制转换为大写。如果在标识符周围加上双引号,Oracle将跳过转换为大写。

    所以如果你做一些像

    CREATE TABLE my_table( 
      col1 number,
      col2 number
    )
    

    你可以

    SELECT * FROM my_table
    SELECT * FROM MY_TABLE
    SELECT * FROM My_Table
    SELECT * FROM "MY_TABLE"
    

    但是有点像

    SELECT * FROM "my_table" 
    

    会失败。

    另一方面,如果你做类似的事情

    CREATE TABLE "my_other_table"( 
      col1 number,
      col2 number
    )
    

    你做不到

    SELECT * FROM my_other_table
    SELECT * FROM MY_OTHER_TABLE
    SELECT * FROM My_Other_Table
    SELECT * FROM "MY_OTHER_TABLE"
    

    但这

    SELECT * FROM "my_other_table" 
    

    将工作

        2
  •  9
  •   Erich Kitzmueller    16 年前

    应添加引号中的标识符可能包含特殊字符,例如,“A-B C.D”是有效标识符。