180

在阅读了一些关于这里的一些 SQL 问题的答案和评论之后,还听说我的一个朋友在一个有禁止它们的政策的地方工作,我想知道在 MySQL 中的字段名称周围使用反引号是否有什么问题.

那是:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
4

11 回答 11

157

使用反引号允许您使用替代字符。在查询写作中这不是一个问题,但如果有人假设你可以只使用反引号,我会假设它可以让你摆脱荒谬的事情,比如

SELECT `id`, `my name`, `another field` , `field,with,comma` 

这当然会生成名称错误的表。

如果您只是简明扼要,我认为它没有问题,您会注意到如果您这样运行查询

EXPLAIN EXTENDED Select foo,bar,baz 

返回的生成警告将具有反引号完全限定的表名。因此,如果您正在使用查询生成功能和查询的自动重写,反引号将使解析代码的任何内容变得不那么混乱。

但是,我认为,与其规定是否可以使用反引号,不如说他们应该有一个名称标准。它解决了更多“真正的”问题。

于 2008-11-04T10:36:21.373 回答
58

反引号的唯一问题是它们不符合 ANSI-SQL,例如它们不能在 SQL Server 中工作。

如果有可能必须将 SQL 移植到另一个数据库,请使用双引号。

于 2008-11-04T10:36:03.793 回答
46

对我来说,在处理字段名称时始终使用它们很有意义。

  • 首先,一旦你养成了习惯,点击反引号键并没有什么坏处。
  • 其次,对我来说,它可以更容易地查看查询中的字段到底是什么,以及关键字或方法是什么。
  • 最后,它允许您在设计表格时使用您希望的任何字段名称。有时将字段命名为“键”、“顺序”或“值”很有意义……所有这些在引用它们时都需要反引号。
于 2008-11-04T10:34:30.753 回答
28

反引号不是标准 ANSI SQL 的一部分。从mysql手册

如果启用了 ANSI_QUOTES SQL 模式,也允许在双引号内引用标识符

因此,如果您使用反引号,然后决定离开 MySQL,您就会遇到问题(尽管您可能还会遇到更大的问题)

于 2008-11-04T10:37:31.933 回答
9

如果您继续使用 MYSQL,则没有任何问题,除了查询的视觉模糊性。但它们确实允许使用保留关键字或嵌入空格作为表名和列名。这是大多数数据库引擎的禁忌,并且会阻止以后的任何迁移。

为了便于阅读,很多人使用大写的 SQL 关键字,例如。

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
于 2008-11-04T10:40:28.667 回答
6

如果你问我,应该总是使用反引号。但是有一些原因可能会导致团队不愿意使用它们。

好处:

  • 使用它们,没有保留字或禁止字符。
  • 在某些情况下,您会收到更具描述性的错误消息。
  • 如果您避免了您不在乎的不良做法,但是...实际上,有时它们是避免 SQL 注入的一种不错的方法。

缺点:

  • 它们不是标准的,通常不可移植。但是,只要您不使用反引号作为标识符的一部分(这是我能想象到的最糟糕的做法),您就可以通过自动删除反引号来移植您的查询。
  • 如果您的某些查询来自 Access,他们可能会用 " 引用表名(也许您不能盲目地删除所有 " )。但是,允许混合使用反引号和双引号。
  • 一些愚蠢的软件或功能会过滤您的查询,并且存在反引号问题。但是,它们是 ASCII 的一部分,因此这意味着您的软件/功能非常糟糕。
于 2012-10-07T14:32:59.663 回答
4

在您的代码库中搜索反引号中的内容要容易得多。假设您有一个名为event. grep -r "event" *可能会返回数百个结果。grep -r "\`event\`" *将返回任何可能引用您的数据库的内容。

于 2010-08-30T20:39:31.010 回答
3

好吧,据我所知,使用反引号的全部目的是让您可以使用与保留关键字一致的名称。因此,如果名称没有与保留关键字冲突,我看不出有任何理由使用反引号。但是,这也不是禁止它们的理由。

于 2008-11-04T10:33:29.773 回答
2

关于反引号的简单事情``用于表示标识符,如 database_name,table_name 等,单引号'',双引号""用于字符串文字,而 "" 用于按原样打印值,'' 打印值变量保持或在另一种情况下,打印他的文字。

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..
于 2017-08-23T11:42:18.627 回答
0

如果您使用某些字段名称作为默认 mysql 或 mssql 值,例如“status”,则必须使用反引号(“select statusfrom table_name”或“select id from table_name where status=1”)。因为mysql返回错误或查询不起作用。

于 2015-04-09T07:19:21.453 回答
-2

SQL 中反引号 (`) 的主要用途是在您将在接下来的子句中再次调用它们的情况下使用它们。建议每隔一段时间使用双引号(“”)。

例如

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

在上面的语句中,您是否看到如何Publisher and LocationGROUP BY子句中再次使用 is。

而不是使用

按名称、城市、州代码分组

我刚用

通过...分组Publisher and Location

只有当这种情况出现时,使用反引号才有用。建议在所有其他时间使用双引号。

于 2019-01-24T17:17:48.073 回答