在字段名周围使用反勾

在阅读了一些关于 SQL 问题的回答和评论之后,并且听说我的一个朋友在一个禁止使用 SQL 的地方工作,我想知道在 MySQL 中使用字段名的反勾是否有什么错误。

那就是:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
104481 次浏览

据我所知,使用反勾的目的是为了使用与保留关键字重合的名称。因此,如果名称与保留关键字没有冲突,我看不出有任何理由使用反勾。但是,这也不是禁止它们的理由。

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

  • 首先,一旦你养成了这个习惯,按一下反勾键并不会有什么坏处。
  • 其次,对我来说,它使得查看查询中的字段以及关键字或方法变得更加容易。
  • 最后,它允许您在设计表时使用任意字段名。有时候,将字段命名为“键”、“顺序”或“值”是很有意义的... ... 所有这些字段在引用它们时都需要反勾。

反向标记的唯一问题是它们不符合 ANSI-SQL,例如,它们不能在 SQLServer 中工作。

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

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

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

它当然会生成名称不好的表。

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

EXPLAIN EXTENDED Select foo,bar,baz

返回的生成的警告将反勾 还有完全限定的表名。因此,如果您使用查询生成特性和自动重写查询,反勾将使解析代码的任何内容不那么令人困惑。

然而,我认为,与其强制规定是否可以使用反勾,不如为名称制定一个标准。它解决了更多的“实际”问题。

反勾不是标准 ANSI SQL 的一部分:

如果 ANSI _ QUOTES SQL 模式为 启用,它也允许引用 双引号中的标识符

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

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

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

如果你问我,应该总是使用反勾。但是有一些原因可以解释为什么团队不愿意使用它们。

优点:

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

缺点:

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

如果使用某些字段名作为默认 mysql 或 mssql 值,例如“ status”,则必须使用反勾(“ select status from table _ name”或“ select id from table _ name where status = 1”)。 因为 mysql 返回错误或者查询无效。

反勾 ``用来表示标识符,如 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..

在 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

只有在这种情况下,使用反引号才是有用的。在其他情况下,建议使用双引号。