FROM`tableName`和FROM tableName有什么不同?

时间:2016-04-22 18:22:31

标签: mysql


1) "select * from `union` WHERE `thanaId`='$thana_id'" // it's working
    VS
2) "select * from union WHERE thanaId='$thana_id'" // it's not working

1 sql查询运行正常,但2 Sql查询无法正常执行。是什么意思[``] .. 1 sql查询和2 sql查询有什么不同?

3 个答案:

答案 0 :(得分:2)

反引号将要处理的字符串包含为名为literal的字符串,而不是由MySQL引擎解释。单词union是一个保留/关键字,因此MYSQL会期望不同的语法,因为它不会意识到您将此单词用作名称标识符。

您可以从MySQL手册中阅读和学习this page。如果您希望MySQL将其视为名称,则此页面列表中的每个单词都应该包含在MySQL查询的反引号中。

尽可能使用关键字或保留字来命名列/表格也很有用!

答案 1 :(得分:0)

行为上的差异是因为 UNION 是MySQL中的保留字。除非转义,否则它不能用作标识符。

在MySQL中,标识符可以通过将它们用反引号字符括起来进行转义。

第一个语句有效,因为关键字FROM后面的标记被解释为标识符,因为它用反引号字符括起来。

第二个语句是抛出语法错误,因为令牌被解释为保留字 UNION ,并且出现在MySQL不期待的地方(MySQL所在的地方)不允许它。)

摘自MySQL参考手册:

  

反引号

     

如果MySQL SQL语句中的标识符包含特殊字符或保留字,则必须使用反引号字符(`)引用它们。例如,要引用名为FOO#BAR的表或名为SELECT的列,您可以将标识符指定为“FOO#BAR”和“SELECT”。由于反引号提供了额外的安全级别,因此它们广泛用于程序生成的SQL语句中,其中标识符名称可能事先不知道。

     

许多其他数据库系统在这些特殊名称周围使用双引号(")。为了便于移植,您可以在MySQL中启用ANSI_QUOTES模式,并使用双引号而不是反引号来限定标识符名称。

答案 2 :(得分:-1)

区别在于,如果mysql语句中的任何单词都带有后面的勾号(`),则mysql会指出您正在引用表或列或某个mysql字段。

如需进一步说明,请查看this answer

谢谢, RK