2009-10-12 123 views
16

我使用反引号构建MYSQL查询。例如,为mysql查询使用反引号/反引号

SELECT `title` FROM `table` WHERE (`id` = 3) 

,而不是:

SELECT title FROM table WHERE (id = 3) 

我觉得我得到了这种做法从phpMyAdmin的出口,并从我的理解,甚至Rails会这样的查询。

但是现在我看到越来越少的像这样构建的查询,而且代码看起来更加复杂,而且在查询中使用反引号更复杂。即使使用SQL辅助函数,没有它们,事情也会变得更简单。因此,我正在考虑让他们落后。

我想知道在这个练习中是否还有其他的含义,比如SQL(我的例子中的MySQL)解释速度等等。您怎么看?

回答

16

反斜杠还允许在表名/列名中使用空格和其他特殊字符(显然除了反引号)。他们不是绝对必要的,但是安全的好主意。

如果你按照明智的规则来命名表和列,反引号应该是不必要的。

+0

是'date'不是一个明智的列名? – 2015-07-14 21:16:03

+0

'date'是其中一个看似明智的,但是MySQL保留字。 MySQL保留字在这里列出:https://dev.mysql.com/doc/refman/5.5/en/keywords.html – Tenner 2015-07-14 21:25:08

+0

@Tenner,如何逃避反向? – 2016-07-07 18:06:57

2

那么,如果你确保你永远不会意外地使用关键字作为标识符,你不需要反引号。 :-)

+1

或任何空间,这样的... – 2012-03-23 16:42:54

1

我的看法是,反引用主要用于防止使用常见SQL标识符的错误查询,即LIMIT和COUNT。

3

反引号用于在mysql查询中转义保留关键字,例如你想有一个count列 - 并不罕见。

您可以使用其他特殊字符或空格在列/表/ DB名

他们并不能让你远离注入攻击(如果你允许用户以某种方式来不好的做法,反正输入列名)

它们不是标准化的sql,只会在mysql中工作;其他dbms将使用"而不是

15

每当我看到这个讨论,我试图游说他们的包容,因为,好吧,答案已经隐藏在这里了,虽然w w w without地没有进一步思考。当我们错误地使用关键字作为字段或表名称时,我们可以通过各种方法避免混淆,但只有敏锐地意识到back-tick'才能带来更大的好处!

sql语句中的每个单词都是通过整个关键字散列表运行以查看是否存在冲突,因此,通过告诉编译器,您知道我在做什么,您不需要检查这些单词,因为它们代表表格和字段名称。速度和优雅。

干杯, 布拉德

+4

加速SQL解析器是一个完全似是而非的原因。您期望SQL解析器获得的加速完全是虚构的。如果你认为有一个加速,测量和量化。否则,这是不必要的,因此不成熟的优化。 – 2013-08-23 19:03:51

1

您在http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

SQL生成器读取标识符文件通常包括反引号,因为它是不是包括所有MySQL的列表简单的保留字。要使用的BMP Unicode字符任何序列除了U + 0000作为标识符,它们可以简单地

  1. 替换所有反引号与双反引号
  2. 环绕与单个反引号

在编写手工查询时,我知道(大部分)MySQL的保留字,而且我更喜欢在可能的情况下不使用反引号,因为它更短,IMO更易于阅读。

大多数情况下,这只是一种风格偏好 - 除非你有类似dateMy Field的字段,然后你必须使用反引号。

1.虽然看到https://bugs.mysql.com/bug.php?id=68676