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

时间:2008-11-04 10:30:20

标签: mysql backticks

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

那是:

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

11 个答案:

答案 0 :(得分:150)

使用反引号允许您使用替代字符。在查询编写中它不是一个问题,但如果假设你可以使用反引号,我会认为它可以让你逃脱像

这样荒谬的东西
SELECT `id`, `my name`, `another field` , `field,with,comma` 

当然,这会产生名称严重的表格。

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

EXPLAIN EXTENDED Select foo,bar,baz 

生成的警告会返回完全限定的表名。因此,如果您正在使用查询生成功能和自动重写查询,反引号会使解析代码的任何事情变得更加困惑。

然而,我认为,不是强制你是否可以使用反引号,而是应该有一个名称标准。它解决了更多“真正的”问题。

答案 1 :(得分:56)

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

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

答案 2 :(得分:44)

对我而言,在处理字段名称时始终使用它们是非常有意义的。

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

答案 3 :(得分:25)

反引号不是标准ANSI SQL的一部分。来自the mysql manual

  

如果是ANSI_QUOTES SQL模式   启用后,也可以引用   双引号内的标识符

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

答案 4 :(得分:8)

如果你继续使用MYSQL没有任何错误,除了查询的视觉效果。但它们允许使用保留关键字或嵌入空格作为表和列名称。对于大多数数据库引擎来说,这是禁忌,并且会阻止以后的任何迁移。

至于易于阅读,许多人对SQL关键字使用上限,例如

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

答案 5 :(得分:6)

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

优点:

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

缺点:

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

答案 6 :(得分:4)

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

答案 7 :(得分:4)

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

答案 8 :(得分:2)

关于反引号的简单事情``用于表示像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..

答案 9 :(得分:0)

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

答案 10 :(得分:0)

SQL中反引号(`)的主要用法是在您将在即将到来的子句中再次调用它们的情况下使用它们。建议每隔两次使用双引号(“”)。

例如

u_salary

在上面的语句中,您看到如何在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 Location

代替使用

  

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

我刚刚使用

  

GROUP BY

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