在一些代碼中,我看到人們把`放在他們的列周圍。爲什麼?與不使用它們有什麼不同嗎?爲什麼把`圍繞欄?
SELECT `players`.`name`, `houses`.`id` FROM `players`, `houses`
WHERE `houses`.`owner` = `players`.`id`
在一些代碼中,我看到人們把`放在他們的列周圍。爲什麼?與不使用它們有什麼不同嗎?爲什麼把`圍繞欄?
SELECT `players`.`name`, `houses`.`id` FROM `players`, `houses`
WHERE `houses`.`owner` = `players`.`id`
使用反引號可以將保留字用作列或表名,例如,
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--"
。
某些列名可能是MySQL中的保留字。在這種情況下,你可以用`引用它們。爲了保持一致性和麪向未來,一些開發人員引用所有標識符。
這種方式使用的反引號的通用術語是「標識符引號」。它們用於包含模式對象(表,列,過程,觸發器等)的名稱。使用它們是因爲它們允許以非法字符(空格,標點符號等)和SQL保留字出現在對象名稱中(或作爲整體)。
爲此目的使用反引號是MySQL特定的。在SQL的ANSI標準中,標識符應該用雙引號"
括起來。默認情況下,MySQL將"
視爲字符串分隔符,但如果將SQL模式設置爲包含ANSI_QUOTES
,則會將"
視爲替代標識符引號(反引號仍然可以)。其他RDBMS也具有專有標識符字符;例如SQL Server允許您使用[...]
以及"..."
。
請注意,這不僅適用於列而且也適用於表格。 – BoltClock 2010-07-16 07:14:13
我經常想知道這件事 - KennTM的回答是正確的,但我們多久會遇到這種情況?從來沒有...但它仍然非常受歡迎使用反引號。我想也許人們就像它在視覺上指明語法的不同部分。 (我也許同意 - 特別是如果沒有大寫關鍵字,這也很好,但我被撕掉)。 – 2010-07-16 07:16:00