2016-04-22 89 views
0
 

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查询有什么不同?FROM`tableName`和FROM tableName有什么不同?

+0

的'是出了名分隔符;由于'UNION'是一个保留字,因此要将其用作字段或表的名称,则必须始终分隔该名称。另一个类似问题的例子是,如果你想从名为'where'的表中选择一个名为'from'的字段, – Uueerdo

回答

2

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

你会很好地阅读和学习MySQL手册中的this page。如果你希望MySQL把它当作名字,那么这个页面列表中的每一个单词都应该在MySQL查询中加入反引号。

它也是有用的尽可能名称列/表与关键字或保留字!

+0

哦是的..谢谢 –

+0

@SalmanQuader我已经更新了我的答案,为你提供了一些更多的细节。 – Martin

0

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

在MySQL中,标识符可以通过将它们包含在反引号字符中来转义。

第一条语句有效,因为关键字FROM后面的标记被解释为标识符,因为它包含在反引号字符中。

第二条语句是抛出语法错误,因为令牌被解释为保留字UNION以及其中MySQL是没有预料到会出现在一个点(其中MySQL不允许它。)

从MySQL参考手册

摘录:MySQL的SQL STAT内

反引号

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

许多其它数据库系统使用双引号(“)将这种特殊的名字。对于便携性,你可以在MySQL使ANSI_QUOTES模式,并使用双引号,而不是反引号来限定标识符名称。

+0

哦,是的..谢谢@spencer –

+0

如果你想在第一个语句中使用与反引号关联的“含义”,反引用词就是“我们之间的字符被解释为*标识符*”。这就是他们的意思。反引号允许我们做的是使用通常不允许用作标识符的字符组合。例如,破折号字符不是标识符中的有效字符,也不允许是与保留字相匹配的字符组合。反引号字符允许我们使用违反通常强制执行的规则的名称。 – spencer7593

+0

是的,我明白了 –

-1

差异是,如果mysql语句中的任何单词用引号(`)引用,则mysql假设您引用表或列或某个mysql字段。

有关进一步的说明可以签出this答案

感谢, RK

相关问题