3 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
SQL標(biāo)準(zhǔn)(當(dāng)前版本為ISO / IEC 9075:2011,分為多個(gè)部分)對(duì)“反勾號(hào)”或“反引號(hào)”符號(hào)(Unicode U + 0060或GRAVE ACCENT)未作任何說(shuō)明;它不能將其識(shí)別為可以在SQL中出現(xiàn)的具有特殊含義的字符。
引用標(biāo)識(shí)符的標(biāo)準(zhǔn)SQL機(jī)制是用雙引號(hào)引起來(lái)的定界標(biāo)識(shí)符:
SELECT "select" FROM "from" WHERE "where" = "group by";
在MySQL中,可以這樣寫(xiě):
SELECT `select` FROM `from` WHERE `where` = `group by`;
在MS SQL Server中,可以這樣寫(xiě):
SELECT [select] FROM [from] WHERE [where] = [group by];
SQL Standard表示法的問(wèn)題在于C程序員習(xí)慣將字符串括在雙引號(hào)中,因此大多數(shù)DBMS都將雙引號(hào)用作標(biāo)準(zhǔn)所識(shí)別的單引號(hào)的替代方法。但是,當(dāng)您要包含標(biāo)識(shí)符時(shí),這就給您帶來(lái)了一個(gè)問(wèn)題。
微軟采取了一種方法。MySQL采用了另一個(gè)。Informix允許單引號(hào)和雙引號(hào)的互換使用,但是如果要使用定界的標(biāo)識(shí)符,則可以設(shè)置環(huán)境變量,然后必須遵循標(biāo)準(zhǔn)(字符串的單引號(hào),標(biāo)識(shí)符的雙引號(hào))。DB2僅遵循標(biāo)準(zhǔn)AFAIK。SQLite似乎遵循該標(biāo)準(zhǔn)。Oracle似乎也遵循該標(biāo)準(zhǔn)。Sybase似乎允許雙引號(hào)(標(biāo)準(zhǔn))或方括號(hào)(與MS SQL Server一樣-這意味著SQL Server可能也允許雙引號(hào))。此頁(yè)面記錄了所有這些服務(wù)器(并幫助填補(bǔ)了我的知識(shí)空白),并指出了帶分隔符的標(biāo)識(shí)符中的字符串是否區(qū)分大小寫(xiě)。
至于何時(shí)在標(biāo)識(shí)符周?chē)褂靡?hào)機(jī)制,我的態(tài)度是“從不”。好吧,不是永遠(yuǎn)不會(huì),而是只有在絕對(duì)被迫這樣做時(shí)才這樣做。
注意,分隔標(biāo)識(shí)符區(qū)分大小寫(xiě);也就是說(shuō),"from"并"FROM"引用不同的列(在大多數(shù)DBMS中-請(qǐng)參見(jiàn)上面的URL)。大多數(shù)SQL都不區(qū)分大小寫(xiě)。知道使用哪種情況很麻煩。(SQL標(biāo)準(zhǔn)具有面向大型機(jī)的方向-它希望將名稱轉(zhuǎn)換為大寫(xiě);不過(guò),大多數(shù)DBMS會(huì)將名稱轉(zhuǎn)換為小寫(xiě)。)
通常,您必須界定標(biāo)識(shí)符,這些標(biāo)識(shí)符是所使用的SQL版本的關(guān)鍵字。這意味著Standard SQL中的大多數(shù)關(guān)鍵字,以及所使用的特定實(shí)現(xiàn)中的所有其他內(nèi)容。
麻煩的一個(gè)持續(xù)根源是升級(jí),其中在發(fā)行版N中不是關(guān)鍵字的列名將成為發(fā)行版N + 1中的關(guān)鍵字。在升級(jí)之前停止工作的現(xiàn)有SQL之后會(huì)停止工作。然后,至少作為短期措施,您可能被迫引用該名稱。但是在正常情況下,您應(yīng)該避免引用引號(hào)。
當(dāng)然,我的態(tài)度因Informix(這是我最常使用的工具)接受此SQL逐字記錄而被大多數(shù)DBMS扼制的事實(shí):
CREATE TABLE TABLE
(
DATE INTEGER NOT NULL,
NULL FLOAT NOT NULL,
FLOAT INTEGER NOT NULL,
NOT DATE NOT NULL,
INTEGER FLOAT NOT NULL
);
當(dāng)然,為演示目的以外的其他目的生產(chǎn)這種可笑桌子的人應(yīng)該被吊起來(lái),畫(huà)好,放進(jìn)四分之一的位置,然后將殘留物修好以修復(fù)他們?cè)斐傻幕靵y。但是,在客戶通常設(shè)法擊中的某些限制內(nèi),關(guān)鍵字可以在許多情況下用作標(biāo)識(shí)符。這本身就是一種面向未來(lái)的有用形式。如果將單詞變成關(guān)鍵字,則現(xiàn)有代碼很有可能會(huì)繼續(xù)工作而不受更改的影響。但是,該機(jī)制并不完善。您無(wú)法使用稱為PRIMARY的列創(chuàng)建表,但可以更改表以添加此類(lèi)列。特質(zhì)是有原因的,但是很難解釋。

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
此外,當(dāng)sql_mode ANSI_QUOTES處于活動(dòng)狀態(tài)時(shí),MySQL和MariaDB還支持雙qoutes ...- > “ ANSI_QUOTES將”視為標(biāo)識(shí)符引號(hào)字符(如`引號(hào)字符)而不是字符串引號(hào)字符。在啟用此模式的情況下,您仍然可以使用`引用標(biāo)識(shí)符。在啟用ANSI_QUOTES的情況下,您不能使用雙引號(hào)對(duì)文字字符串加引號(hào),因?yàn)樗鼈儽唤忉尀闃?biāo)識(shí)符?!?/em>這是符合ANSI SQL標(biāo)準(zhǔn)線..

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
盡管我不一定同意,但我非常喜歡這個(gè)答案,這使我的知識(shí)大為增加,+ 1謝謝。我仍然會(huì)繼續(xù)使用反引號(hào)!:)我更擔(dān)心很多老節(jié)目突然不能工作,不必查詢傳遞到轉(zhuǎn)換函數(shù)替換用反引號(hào)[和] 如果我發(fā)生改變數(shù)據(jù)庫(kù)..
- 3 回答
- 0 關(guān)注
- 775 瀏覽
添加回答
舉報(bào)