为啥我的所有 SQL 查询都必须使用 ` 符号包装?

Posted

技术标签:

【中文标题】为啥我的所有 SQL 查询都必须使用 ` 符号包装?【英文标题】:Why do all my SQL queries have to be wrapped using the ` symbol?为什么我的所有 SQL 查询都必须使用 ` 符号包装? 【发布时间】:2018-12-14 04:07:18 【问题描述】:

我一直在为我的课程作业创建一个数据库,并使用 phpMyAdmin 来构建它。现在我正在使用查询工具处理查询。

当我选择要查询的表和数据并按“更新查询”时,它将生成如下所示的查询:

SELECT `Customer`.`CustomerName`, `OrderDetails`.`Product`, `OrderDetails`.`QuantityOrdered`
FROM `Customer`
LEFT JOIN `Order` ON `Order`.`Customer` = `Customer`.`CustomerID`
LEFT JOIN `OrderDetails` ON `OrderDetails`.`Order` = `Order`.`OrderID`

这很好用,并给了我预期的结果。但是,当我尝试编写自己的查询并输入“SELECT Customer.CustomerName”之类的内容时,如果没有 ' 符号,它将无法正常工作,只会引发错误消息。

我必须始终使用 ' 符号包装它们以使查询起作用吗?

【问题讨论】:

Using backticks around field names的可能重复 您不需要转义标识符,因为它们格式正确(非关键字,无特殊字符)。大多数人觉得这是一个烦人的习惯,因为它使查询更难阅读。许多自动查询生成器沉迷于这种烦人的习惯。 是的,如果我是正确的,当您的名字是保留字时,您必须在编写查询时使用 ' 符号 除非您的名字是保留字,否则您可以忽略它们。以前有人问过这个问题。 一般来说,如果您询问有关引发错误的代码的问题,包括具体的错误以及在您的问题中生成错误的代码的完整示例,您会得到更好的答复。 【参考方案1】:

前引号用于转义 mysql 中的对象名称。除非您使用不是有效标识符的名称,否则您不必使用它们 - 在这种情况下,表名 order 是保留字,必须转义。您使用的所有其他表和列似乎都正常。

【讨论】:

谢谢!我再次运行查询并将'符号放在“订单”表周围,它工作正常。这是一个很大的帮助。我对 SQL 和这个网站非常陌生,但感谢您抽出宝贵时间提供帮助。 @xcom 不要使用' 符号来引用标识符。直引号' 用于引用字符串和日期。反引号不是同一个符号。在美式键盘上,反引号位于左上角,在制表键上方。 谢谢@BillKarwin。我刚刚查看了保留字列表。我应该避免出现在这个列表中的任何表名吗? docs.oracle.com/javadb/10.8.3.0/ref/rrefkeywords29722.html @xcom 如果可以的话(例如,重写一些旧应用程序不需要大量的工作) - 是的 @xcom 您链接到 Derby 的保留字列表,而不是 MySQL。尽管 SQL 是一种标准语言,但所有品牌都添加了自己的“扩展”,因此您应该将文档用于您使用的数据库。将此列表用于 MySQL 保留字:dev.mysql.com/doc/refman/8.0/en/keywords.html【参考方案2】:

除了视觉上的噩梦和创建可怕的表名的能力之外,反引号是完全没有必要的。但是,您需要将任何变量括在单引号中。

从下面的示例中可以看出,PHPMYADMIN 不需要使用反引号;

删除反引号时它不起作用的原因是因为您有一个名为“订单”的列。 Order 是 SQL 中的关键字,因此不能在不包含在引号或反引号中的情况下用作列名。

【讨论】:

我尝试了另一个不使用我的“订单”表的查询,并且它在没有反引号的情况下运行良好。我想我会更改我的订单表的名称。感谢您的回复。

以上是关于为啥我的所有 SQL 查询都必须使用 ` 符号包装?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SQL Server 在 equals 语句中忽略表情符号?

SQL新建查询时,表名没错,为啥说对象名无效

SQL Server表名为啥要加方括号?

为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?

如果应该准备所有 SQL 查询以防止 SQL 注入,为啥语法允许非准备查询?

为啥 SQL 查询在最合适的时候不使用主键进行 SELECT?