在某些代码中,我看到人们把`放在他们的专栏周围。为什么?与不使用它们有什么区别吗?
SELECT `players`.`name`, `houses`.`id` FROM `players`, `houses`
WHERE `houses`.`owner` = `players`.`id`
答案 0 :(得分:19)
使用反引号可以将保留字用作列名或表名,例如
SELECT `values` FROM `references` WHERE `precision` > 0
并且带有非字母数字的名称也必须包含在“`”之间,例如。
SELECT `user name` FROM `registered users` WHERE `total score` > 0
有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/identifiers.html。
我认为在动态使用这些名称时经常会出现这种情况,例如: (人为的例子)
mysql_prepare_statement("SELECT `%q` FROM `%q` WHERE `%q` > 0", col, tbl, col_cond);
在这种形式下,任何类型的列和表名都可以相同地处理,并且可以避免恶意注入尝试,例如col = "1; DROP TABLE users--"
。
答案 1 :(得分:3)
某些列名可能是MySQL中的保留字。在这种情况下,你可以用`引用它们。为了保持一致性和面向未来,一些开发人员引用了所有标识符。
答案 2 :(得分:1)
以这种方式使用的反引号的常用术语是“标识符引号”。它们用于包含模式对象的名称(表,列,过程,触发器等)。使用它们是因为它们允许其他非法字符(空格,标点字符等)和SQL保留字出现在对象名称内(或作为整体)。
为此目的使用反引号是特定于MySQL的。在ANSI的ANSI标准中,标识符应该用双引号"
括起来。默认情况下,MySQL将"
视为字符串分隔符,但如果将SQL模式设置为包含ANSI_QUOTES
,则会将"
视为替代标识符引号(反引号仍然有效) )。其他RDBMS也有专有的标识符字符;例如,SQL Server允许您使用[...]
以及"..."
。