为了账号安全,请及时绑定邮箱和手机立即绑定

SQL标准对backtick(`)的用法怎么说?

SQL标准对backtick(`)的用法怎么说?

慕婉清6462132 2019-11-18 10:17:10
有一次,我在调试使用简单的SQL查询花了几个小时mysql_query()中PHP/MySQL才知道原来我错过了bactick周围的表名。从那时起,我一直在表名周围使用它。但是当我在中使用相同SQLite/C++符号时,该符号甚至无法识别。是否使用此选项会造成混淆?标准对此有何说法?另外,如果有人可以告诉我何时使用引号以及何时不使用引号,也会很有帮助。我的意思是围绕值和字段名称。
查看完整描述

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的列创建表,但可以更改表以添加此类列。特质是有原因的,但是很难解释。


查看完整回答
反对 回复 2019-11-18
?
ibeautiful

TA贡献1993条经验 获得超5个赞

此外,当sql_mode ANSI_QUOTES处于活动状态时,MySQL和MariaDB还支持双qoutes ...- > “ ANSI_QUOTES将”视为标识符引号字符(如`引号字符)而不是字符串引号字符。在启用此模式的情况下,您仍然可以使用`引用标识符。在启用ANSI_QUOTES的情况下,您不能使用双引号对文字字符串加引号,因为它们被解释为标识符。“这是符合ANSI SQL标准线.. 

查看完整回答
反对 回复 2019-11-18
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

尽管我不一定同意,但我非常喜欢这个答案,这使我的知识大为增加,+ 1谢谢。我仍然会继续使用反引号!:)我更担心很多老节目突然不能工作,不必查询传递到转换函数替换用反引号[和] 如果我发生改变数据库.. 

查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 662 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信