有一次,我在调试使用简单的SQL查询花了几个小时mysql_query()
在PHP/MySQL
才知道原来我错过了bactick周围的表名。 从那以后,我一直一直用它周围的表名。
但是,当我用同样的SQLite/C++
,符号甚至没有认可。 这是令人困惑,是否使用此与否? 这是什么标准说一下它的使用情况如何?
此外,这将是有益的,如果有人能告诉我什么时候使用引号,何时不。 我的意思是围绕价值和字段名。
有一次,我在调试使用简单的SQL查询花了几个小时mysql_query()
在PHP/MySQL
才知道原来我错过了bactick周围的表名。 从那以后,我一直一直用它周围的表名。
但是,当我用同样的SQLite/C++
,符号甚至没有认可。 这是令人困惑,是否使用此与否? 这是什么标准说一下它的使用情况如何?
此外,这将是有益的,如果有人能告诉我什么时候使用引号,何时不。 我的意思是围绕价值和字段名。
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
);
当然,谁比示范的目的以外的任何产生这样一个荒谬的表的人应该挂,肢解,然后将残留物提出,要解决他们所创建的混乱。 但是,该客户经常管理,达到一定的限度之内,关键字可以作为在许多情况下标识符。 也就是说,它本身,适应未来发展的一个有用的形式。 如果一个词成为关键词,有一个温和的机会,现有的代码将继续改变工作不受影响。 然而,机制不健全; 你不能创建一个表,一个叫主列,但你可以改变一个表以添加这样的列。 没有为特质的一个原因,但它是很难解释。