在字段名称周围使用反引号

Using backticks around field names

提问人:nickf 提问时间:11/4/2008 最后编辑:Blaszardnickf 更新时间:1/25/2019 访问量:106042

问:

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

那是:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
MySQL 反引号

评论

28赞 knittl 8/31/2010
如果您想拥有 、 或类似的列名,反引号非常方便counttypetable
1赞 Ian Ringrose 5/6/2014
另请参阅 stackoverflow.com/questions/23446377/...
0赞 dallin 10/20/2018
@knittl我认为问题是,您是否应该有像 、 和 这样的列名。这些都是非常模棱两可的术语,几乎在每一种情况下,这些名称都可以改进得更具体。像这样命名你的列也是危险的,也是潜在的错误来源,因为你永远不知道什么时候有人可能会忘记添加反引号,或者没有意识到他们必须这样做。我认为最好避免使用保留术语作为列名。counttypetable
0赞 Markus Zeller 11/25/2018
我总是使用它们,所以我不会在任何时候使用保留关键字而处于危险之中。

答:

3赞 C. K. Young 11/4/2008 #1

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

46赞 nickf 11/4/2008 #2

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

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

评论

21赞 alex 9/17/2010
您还应该补充一点,它可以保护您免受将来使用的任何保留词(以前曾咬过我)。
5赞 Brian Leishman 4/9/2015
实际上,我曾经有人编辑过我的一个问题中多余的反引号,这让我很不高兴,因为这个原因正是我用它们包围每个变量的确切原因
2赞 Aternus 8/25/2016
它还允许安全使用非英文标签,仅此一项就足以鼓励使用反引号。
58赞 Alexander Kojevnikov 11/4/2008 #3

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

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

评论

17赞 bobince 11/4/2008
是的。使用MySQL的ANSI模式(dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html)在MySQL中启用双引号,从而重新获得跨数据库兼容性。反引号/引号也是必要的,因为您永远不知道在未来的 DBMS 版本中什么会成为保留字。
1赞 Miquella 11/20/2008
这是千真万确的!我们的一个服务器应用程序运行良好,直到我们对数据库引擎进行了升级,并添加了一个新关键字。突然间,所有查询特定表的东西都坏了。
0赞 alex 9/17/2010
@bobince 当我开始开发时,我命名了一个列或类似的东西。当我们升级到 MySQL 5 时,它失败了,因为它是一个新的保留字!range
1赞 Altonymous 12/28/2012
不要使用双引号。它并不总是有效。例如。。。从 WHERE 删除 (“key” = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range');查询正常,0 行受影响(0.00 秒) DELETE FROM WHERE ( = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range');查询正常,受影响的 5 行(0.00 秒)app_key_storesapp_key_storeskey
157赞 Kent Fredric 11/4/2008 #4

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

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

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

如果你只是简明扼要,我看不出有什么问题, 如果以这种方式运行查询,则会注意到

EXPLAIN EXTENDED Select foo,bar,baz 

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

然而,我认为,与其强制要求你是否可以使用反引号,不如让他们有一个名称标准。它解决了更多“真实”的问题。

评论

0赞 Yousuf Memon 12/27/2013
我们还需要在PostgreSQL中使用它们吗?
5赞 Kent Fredric 1/4/2014
没有必要,只有建议。如果将来添加了共享字段名称的 SQL 关键字,则用引号表示它们以避免与 SQL 关键字产生歧义是很有用的。您/需要/引用的唯一时间是当一个字段共享关键字名称时,例如,vs 将给出非常不同的结果。但 postgres 与 mysql 的区别有 2 个方面:1.字段由 引用。2. 未加引号的字段不区分大小写 postgresql.org/docs/current/static/...select count from fooselect "count" from foo""
28赞 Greg 11/4/2008 #5

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

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

因此,如果您使用反引号,然后决定离开MySQL,那么您就有问题了(尽管您可能也有更大的问题)

9赞 Christian Lescuyer 11/4/2008 #6

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

至于易于阅读,许多人对 SQL 关键字使用大写字母,例如。

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
4赞 EllisGL 8/31/2010 #7

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

评论

0赞 ankush981 8/5/2015
一般来说,这并不是一个真正的好处。专业人士遇到的表格的名称更像是new_users_info而不是“一般”。
6赞 Federico 10/7/2012 #8

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

优势:

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

弊:

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

评论

9赞 Andy Lester 8/24/2013
使用反引号与避免 SQL 注入完全无关。
6赞 6/7/2014
@andy它可能会有所帮助,因为攻击者必须用另一个反引号关闭它才能注入。它的作用不大,但这仍然是一些东西
0赞 ysrtymz 4/9/2015 #9

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

2赞 Sonpal singh Sengar 8/23/2017 #10

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

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..
-2赞 Command 1/25/2019 #11

反引号 (') 在 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

而不是使用

分组依据 姓名、城市、州代码

我刚刚用过

分组依据Publisher and Location

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