当前位置:  开发笔记 > 后端 > 正文

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

如何解决《在字段名称周围使用反引号》经验,为你挑选了6个好方法。

在这里阅读了几个关于SQL问题的答案和评论后,还听到我的一个朋友在一个禁止它们的政策的地方工作,我想知道在MySQL中使用反引号是否有任何问题.

那是:

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

Kent Fredric.. 152

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

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

这当然会产生命名严重的表.

如果你只是简洁,我没有看到它的问题,你会注意到你是否运行你的查询

EXPLAIN EXTENDED Select foo,bar,baz 

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

但是我认为,不是要求你是否可以使用反引号,而是应该有一个名称标准.它解决了更多"真正的"问题.



1> Kent Fredric..:

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

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

这当然会产生命名严重的表.

如果你只是简洁,我没有看到它的问题,你会注意到你是否运行你的查询

EXPLAIN EXTENDED Select foo,bar,baz 

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

但是我认为,不是要求你是否可以使用反引号,而是应该有一个名称标准.它解决了更多"真正的"问题.


没有必要,只有推荐.引用它们以避免与SQL关键字产生歧义很有用,如果将来添加了一个共享字段名称的SQL关键字.你/需要/引用的唯一时间是当一个字段_does_共享一个关键字名称时,例如,`foo`中的select count和来自foo`的`select"count"会产生非常不同的结果.但是postgres在两个方面与mysql不同:1.字段由`""引用.2.不带引号的字段不区分大小写http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

2> Alexander Ko..:

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

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


是的.使用MySQL的ANSI模式 - http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - 在MySQL中启用双引号,从而重新获得跨数据库兼容性.反引号/引号也是必要的,因为你永远不知道在未来的DBMS版本中它将成为一个保留字.

3> nickf..:

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

首先,一旦你养成习惯,只需按下反击键即可.

其次,对我来说,它可以更容易地查看查询中的字段到底是什么,以及什么是关键字或方法.

最后,它允许您在设计表时使用您希望的任何字段名称.有时命名字段"键","顺序"或"值"是很有意义的...所有这些都需要在引用它们时使用反引号.


您还应该补充一点,它可以保护您免受任何未来使用的保留字(以前曾经咬过我).
我实际上有人在我的一个问题中编辑了额外的反复,这让我心烦意乱,因为这个原因是我用它们包围每个变量的确切原因
它还允许安全使用非英语标签,仅此一项就足以鼓励使用反引号.

4> Greg..:

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

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

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



5> Christian Le..:

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;



6> 小智..:

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

好处:

使用它们,没有保留字或禁止字符.

在某些情况下,您会收到更多描述性错误消息.

如果你避免不好的做法,你就不在乎,但......实际上,有时它们是避免SQL注入的一种不错的方法.

缺点:

它们不是标准的,通常不便携.但是,只要您不使用反引号作为标识符的一部分(这是我能够想象的最糟糕的做法),您可以通过自动删除反引号来移植查询.

如果你的一些查询来自Access,他们可能引用表名称"(也许你不能盲目地删除所有").但是,允许使用反引号和双引号的混合物.

一些愚蠢的软件或功能会过滤您的查询,并且在反引号方面存在问题.但是,它们是ASCII的一部分,因此这意味着您的软件/功能非常糟糕.


使用反引号与避免SQL注入完全无关.
@andy它可能**帮助,因为攻击者不得不用另一个反引号关闭它来注入.它做得很少,但这仍然是一些东西
推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有