3 回答
TA贡献1864条经验 获得超6个赞
SQL标准(当前版本为ISO / IEC 9075:2011,分为多个部分)对“反勾号”或“反引号”符号(Unicode U + 0060或GRAVE ACCENT)未作任何说明;它不能将其识别为可以在SQL中出现的具有特殊含义的字符。
引用标识符的标准SQL机制是用双引号引起来的定界标识符:
SELECT "select" FROM "from" WHERE "where" = "group by";
在MySQL中,可以这样写:
SELECT `select` FROM `from` WHERE `where` = `group by`;
在MS SQL Server中,可以这样写:
SELECT [select] FROM [from] WHERE [where] = [group by];
SQL Standard表示法的问题在于C程序员习惯将字符串括在双引号中,因此大多数DBMS都将双引号用作标准所识别的单引号的替代方法。但是,当您要包含标识符时,这就给您带来了一个问题。
微软采取了一种方法。MySQL采用了另一个。Informix允许单引号和双引号的互换使用,但是如果要使用定界的标识符,则可以设置环境变量,然后必须遵循标准(字符串的单引号,标识符的双引号)。DB2仅遵循标准AFAIK。SQLite似乎遵循该标准。Oracle似乎也遵循该标准。Sybase似乎允许双引号(标准)或方括号(与MS SQL Server一样-这意味着SQL Server可能也允许双引号)。此页面记录了所有这些服务器(并帮助填补了我的知识空白),并指出了带分隔符的标识符中的字符串是否区分大小写。
至于何时在标识符周围使用引号机制,我的态度是“从不”。好吧,不是永远不会,而是只有在绝对被迫这样做时才这样做。
注意,分隔标识符区分大小写;也就是说,"from"并"FROM"引用不同的列(在大多数DBMS中-请参见上面的URL)。大多数SQL都不区分大小写。知道使用哪种情况很麻烦。(SQL标准具有面向大型机的方向-它希望将名称转换为大写;不过,大多数DBMS会将名称转换为小写。)
通常,您必须界定标识符,这些标识符是所使用的SQL版本的关键字。这意味着Standard SQL中的大多数关键字,以及所使用的特定实现中的所有其他内容。
麻烦的一个持续根源是升级,其中在发行版N中不是关键字的列名将成为发行版N + 1中的关键字。在升级之前停止工作的现有SQL之后会停止工作。然后,至少作为短期措施,您可能被迫引用该名称。但是在正常情况下,您应该避免引用引号。
当然,我的态度因Informix(这是我最常使用的工具)接受此SQL逐字记录而被大多数DBMS扼制的事实:
CREATE TABLE TABLE
(
DATE INTEGER NOT NULL,
NULL FLOAT NOT NULL,
FLOAT INTEGER NOT NULL,
NOT DATE NOT NULL,
INTEGER FLOAT NOT NULL
);
当然,为演示目的以外的其他目的生产这种可笑桌子的人应该被吊起来,画好,放进四分之一的位置,然后将残留物修好以修复他们造成的混乱。但是,在客户通常设法击中的某些限制内,关键字可以在许多情况下用作标识符。这本身就是一种面向未来的有用形式。如果将单词变成关键字,则现有代码很有可能会继续工作而不受更改的影响。但是,该机制并不完善。您无法使用称为PRIMARY的列创建表,但可以更改表以添加此类列。特质是有原因的,但是很难解释。
TA贡献1993条经验 获得超5个赞
此外,当sql_mode ANSI_QUOTES处于活动状态时,MySQL和MariaDB还支持双qoutes ...- > “ ANSI_QUOTES将”视为标识符引号字符(如`引号字符)而不是字符串引号字符。在启用此模式的情况下,您仍然可以使用`引用标识符。在启用ANSI_QUOTES的情况下,您不能使用双引号对文字字符串加引号,因为它们被解释为标识符。“这是符合ANSI SQL标准线..
TA贡献1893条经验 获得超10个赞
尽管我不一定同意,但我非常喜欢这个答案,这使我的知识大为增加,+ 1谢谢。我仍然会继续使用反引号!:)我更担心很多老节目突然不能工作,不必查询传递到转换函数替换用反引号[和] 如果我发生改变数据库..
- 3 回答
- 0 关注
- 712 浏览
添加回答
举报