【问题标题】:What exactly do quotation marks around the table name do?表名两边的引号到底有什么作用?
【发布时间】:2010-10-08 11:09:27
【问题描述】:

我认为引号 (") 只是一种分组标记,但我正在调试一些 NHibernate 代码并注意到虽然

SELECT * FROM site WHERE site_id = 3;

工作正常

SELECT * FROM "site" WHERE site_id = 3;

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

什么给了?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    在 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】:

    需要补充的是,引号中的标识符可能包含特殊字符,例如“a-b c.d”是一个有效的标识符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2017-07-26
      • 2011-04-18
      • 2012-05-09
      • 2022-11-29
      • 2019-11-03
      相关资源
      最近更新 更多