什么是SQL标准说关于反引号(`)的用法?什么是SQL标准说关于反引号(`)的用法?(What do

2019-05-14 01:30发布

有一次,我在调试使用简单的SQL查询花了几个小时mysql_query()PHP/MySQL才知道原来我错过了bactick周围的表名。 从那以后,我一直一直用它周围的表名。

但是,当我用同样的SQLite/C++ ,符号甚至没有认可。 这是令人困惑,是否使用此与否? 这是什么标准说一下它的使用情况如何?

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

Answer 1:

SQL标准(目前的版本是ISO / IEC 9075:2011,在多个部分)只字未提“回剔”或“回报价”符号(Unicode的U + 0060或重音符); 它不承认它作为可以出现在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程序员用来封闭在双引号中的字符串,所以大多数DBMS用双引号来替代由标准认可的单引号。 但是,那么,当你想附上标识符留给你一个问题。

微软采取了一种方法; MySQL的又过了; Informix的允许互换使用单引号和双引号的,但如果你想定界标识,设置环境变量,然后你必须遵循的标准(单引号字符串,标识符双引号); DB2只遵循标准,AFAIK; SQLite的似乎遵循标准的; 甲骨文似乎也遵循标准的; SYBASE似乎允许双引号(标准)或方括号(如MS SQL服务器 - 这意味着SQL Server可能会允许双引号也行)。 这页文档中的所有这些服务器(和是有帮助填写在我的知识空缺)是否字符串内分隔标识符是大小写敏感与否,和注意事项。


至于何时使用标识周围的一个引用机制,我的态度是“从不”。 嗯,不太永远,但只有当绝对被迫这样做。

需要注意的是分隔标识符是区分大小写的; 那就是, "from""FROM"是指不同的列(在大多数DBMS -见上面URL)。 大多数SQL是不区分大小写; 它是知道使用哪种情况造成滋扰。 (SQL标准在大型机方向 - 它预计的名字将被转换为大写;大多数DBMS转换名称为小写,虽然)。

在一般情况下,你必须界定哪些是关键字SQL版本您正在使用的标识符。 这意味着,大多数中的关键字的标准SQL ,加上是特定的实现(或多个)您所使用的一部分的任何附加功能。

的麻烦一个持续来源是升级,其中,这不是在释放N A关键字列名变为释放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
);

当然,谁比示范的目的以外的任何产生这样一个荒谬的表的人应该挂,肢解,然后将残留物提出,要解决他们所创建的混乱。 但是,该客户经常管理,达到一定的限度之内,关键字可以作为在许多情况下标识符。 也就是说,它本身,适应未来发展的一个有用的形式。 如果一个词成为关键词,有一个温和的机会,现有的代码将继续改变工作不受影响。 然而,机制不健全; 你不能创建一个表,一个叫主列,但你可以改变一个表以添加这样的列。 没有为特质的一个原因,但它是很难解释。



文章来源: What does the SQL Standard say about usage of backtick(`)?