SQL标准对反引号(`)的使用有何看法?

Shu*_*ham 42 sql sqlite standards

一旦我花了几个小时调试一个简单的SQL查询mysql_query(),PHP/MySQL只是为了意识到我错过了关于表名的bactick.从那时起,我一直在使用表名.

但是当我使用相同SQLite/C++的符号时,符号甚至无法识别.令人困惑的是,是否使用这个?标准对使用它有什么看法?

此外,如果有人能告诉我何时使用报价,何时不能报价,将会有所帮助.我的意思是值和字段名称.

Jon*_*ler 75

SQL标准(当前版本为ISO/IEC 9075:2011,分为多个部分)没有说明"后退"或"反引号"符号(Unicode U + 0060或GRAVE ACCENT); 它不会将其识别为可以出现在SQL中的具有特殊含义的字符.

引用标识符的标准SQL机制是用双引号括起来的分隔标识符:

SELECT "select" FROM "from" WHERE "where" = "group by";
Run Code Online (Sandbox Code Playgroud)

在MySQL中,可能会写:

SELECT `select` FROM `from` WHERE `where` = `group by`;
Run Code Online (Sandbox Code Playgroud)

在MS SQL Server中,可能写入:

SELECT [select] FROM [from] WHERE [where] = [group by];
Run Code Online (Sandbox Code Playgroud)

SQL标准符号的问题在于C程序员习惯用双引号括起字符串,因此大多数DBMS使用双引号作为标准识别的单引号的替代.但是,当您想要包含标识符时,这会让您遇到问题.

微软采取了一种方法; MySQL又拿了一个; Informix允许单引号和双引号的可互换使用,但是如果你想要分隔标识符,你设置一个环境变量然后你必须遵循标准(字符串的单引号,标识符的双引号); DB2仅遵循标准AFAIK; SQLite似乎遵循标准; Oracle似乎也遵循该标准; Sybase似乎允许使用双引号(标准)或方括号(与MS SQL Server一样 - 这意味着SQL Server也可能允许双引号).这个页面记录了所有这些服务器(并且有助于填补我的知识空白),并注意分隔标识符内的字符串是否区分大小写.


至于何时使用围绕标识符的引用机制,我的态度是"永远".好吧,并非完全没有,但只有在绝对强迫这样做的时候.

请注意,分隔标识符区分大小写; 也就是说,"from""FROM"引用不同的列(在大多数DBMS中 - 请参阅上面的URL).大多数SQL不区分大小写; 了解使用哪种情况令人讨厌.(SQL标准具有大型机方向 - 它希望将名称转换为大写;但大多数DBMS将名称转换为小写.)

通常,您必须将与您正在使用的SQL版本关联的标识符分隔开.这意味着标准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
);
Run Code Online (Sandbox Code Playgroud)

当然,除了示范目的之外,制作这样一个荒谬的桌子的人应该被挂起,抽出,四分之一,然后应该留下残余来解决他们创造的混乱.但是,在客户经常设法达到的某些限制范围内,关键字可以在许多情况下用作标识符.这本身就是一种有用的未来证明形式.如果一个单词成为关键字,那么现有代码将继续不受更改影响的可能性很小.但是,机制并不完美; 您不能使用名为PRIMARY的列创建表,但您可以更改表以添加此类列.特质是有原因的,但很难解释.