SQL标准对于反引用(`)的用法是什么?

一旦我花了几个小时在PHP/MySQL使用mysql_query()来debugging一个简单的SQL查询,才意识到我错过了表名的凑钱。 从那以后,我一直在围绕表名使用它。

但是,当我在SQLite/C++使用相同的,符号甚至不被识别。 这是否令人困惑,是否使用这个? 标准对使用它有什么意义?

另外,如果有人能告诉我什么时候使用引号,什么时候不使用引号,这将是有帮助的。 我的意思是围绕着价值和字段名称。

SQL标准(当前版本是ISO / IEC 9075:2011,多个部分)没有提到“back-tick”或“back-quote”符号(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标准符号的麻烦是C程序员被用来将string括在双引号中,因此大多数DBMS使用双引号作为标准识别的单引号的替代。 但是,当你想要包含标识符的时候,这会给你带来一个问题。

微软采取了一种方法; MySQL另一个; Informix支持单引号和双引号的互换使用,但是如果你想分隔标识符,你需要设置一个环境variables,然后你必须遵循标准(单引号string,双引号标识符)。 DB2只遵循标准AFAIK; SQLite似乎遵循标准; Oracle也似乎遵循这个标准; Sybase似乎允许使用双引号(标准)或方括号(与MS SQL Server一样 – 这意味着SQL Server也可能允许使用双引号)。 这个页面logging了所有这些服务器(并且有助于填补我所知道的空白),并指出分隔标识符内的string是否区分大小写。


至于何时使用标识符的引用机制,我的态度是“从不”。 那么,不是绝对不会,而只是在绝对被迫这样做的时候。

请注意,分隔标识符区分大小写; 即"from""FROM"是指不同的列(在大多数DBMS中 – 参见上面的URL)。 大部分SQL不区分大小写; 知道使用哪种情况是一件令人讨厌的事情。 (SQL标准有一个大型机定位 – 它期望名称被转换为大写;尽pipe大多数DBMS将名称转换为小写。)

通常,您必须将与您所使用的SQL版本相关的标识符分隔开来。 这意味着标准SQL中的大部分关键字,以及您正在使用的特定实现的一部分。

问题的一个持续来源是升级,其中发行版N中不是关键字的列名成为发行版N + 1中的关键字。 在升级之前工作的现有SQL在之后停止工作。 那么,至less作为一个短期的措施,你可能会被迫引用这个名字。 但在正常情况下,您应该避免需要引用标识符。

当然,我的态度被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 ); 

当然,为了示范目的而制作这样一个荒谬的桌子的人,应该被挂起,拉上,扎堆,然后留下残余物来修补他们所创造的烂摊子。 但是,在客户常规打击的一些限制内,关键字可以在许多情况下用作标识符。 也就是说,它本身就是一种有益于未来发展的有用forms。 如果一个单词成为一个关键字,那么现有的代码将继续不受变化的影响。 但是机制并不完善, 你不能创build一个名为PRIMARY的列的表,但是你可以改变一个表来添加这样一个列。 有一个特质的原因,但很难解释。