2009-02-18 44 views
37

我認爲引號(「)僅僅是一種類型的分組標記,但我調試一些NHibernate的代碼,並注意到,雖然表名周圍的引號是幹什麼用的?

SELECT * FROM site WHERE site_id = 3; 

做工精細

SELECT * FROM "site" WHERE site_id = 3; 

失敗,表或視圖不存在錯誤。

是怎麼回事?

回答

78

把周圍甲骨文原因的標識符雙引號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" 

將工作

+1

這個答案忽略了它也允許標識符包含否則將是非法的字符的事實,例如空格字符。這也可能是最好的做法,只使用大寫字母,數字和下劃線。這樣做會讓每個人的生活更輕鬆。 – jpmc26 2016-06-14 18:55:13

9

應該補充該標識符在引號中可以包含特殊字符,例如「a-b c.d」是一個有效的標識符。

相關問題