2009-10-12 13 views
16

私はbackticksでMYSQLクエリを構築しています。例えば、mysqlクエリにbackquote/backticksを使用する

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

と対照的に:

SELECT title FROM table WHERE (id = 3) 

は、私は私もRailsは、このようにそのクエリを生成し、phpMyAdminの輸出から、と私は理解し何からこの練習を得たと思います。

しかし、今日では、このように構築されたクエリがますます少なくなっています。また、コードはクエリのバックティックで複雑で複雑になります。 SQLヘルパー関数を使用しても、それがなければ簡単になります。したがって、私はそれらを残しておくことを検討しています。

私は、SQL(私の場合はMySQL)の解釈速度など、このプラクティスに他の意味があるかどうかを知りたかったのですが、どう思いますか?

答えて

16

バッククォートでは、表名/列名にスペースやその他の特殊文字(バッククォートを除く)を使用することもできます。彼らは厳密には必要ではありませんが、安全のための良いアイデアです。

テーブルとカラムの命名規則に従うならば、バッククイックは不要です。

+0

は 'date'ない賢明な列名ですか? –

+0

'date'は分かりやすいようですが、MySQLの予約語です。 MySQLの予約語は以下の通りです:https://dev.mysql.com/doc/refman/5.5/en/keywords.html – Tenner

+0

@Tenner、バックティックから脱出する方法は? –

2

キーワードを誤って識別子として使用しないようにする場合は、バックティックは必要ありません。 :-)

+1

または任意のスペースを見ると、このような... –

1

私の考えでは、backticksは主に、一般的なSQL識別子(LIMITとCOUNT)を利用した誤ったクエリを防ぐために使用されていました。

3

backticksは、mysqlクエリで予約されたキーワードをエスケープするために使用されます。 count列が必要です。これはあまり一般的ではありません。あなたは、彼らがインジェクション攻撃から安全保つのをしていない、あなたの列/テーブル/ DB名

の中で、他の特殊文字やスペースを使用することができます

(ユーザーがとにかく何らかの方法-悪い習慣に列名を入力できるようにする場合)

これらは標準化されたSQLではなく、mysqlでのみ動作します。他のDBMSは"を使用する代わりに

15

私はよく、答えはすでにここに隠されている、ので、顔をしかめ離れて、さらに考えずウィンクものの、これは、私は彼らの包含のためにロビーしようと、議論見るたびに。誤ってフィールド名やテーブル名としてキーワードを使用すると、さまざまな方法で混乱を避けることができますが、敏感に認識するバックティックだけがさらに大きな利益をもたらします!

キーワード・ハッシュ・テーブル全体が、キーワード・ハッシュ・テーブル全体を通して実行されるため、競合が発生しているかどうかを確認することができます。これは、コンパイラに、私が何をしているのか、テーブル名とフィールド名を表すため、これらの単語を確認する必要はありません。スピードとエレガンス。

乾杯、 ブラッド

+4

SQLパーサの高速化はまったく正当な理由です。 SQLパーサーが得ることが期待されるスピードアップは完全に虚偽です。スピードアップがあると思うなら、それを測定して定量化してください。そうでなければ、それは不必要で早期の最適化です。 –

1

は、あなたはそれが予約語のすべてのMySQLのリストを含む、より単純であるとして、多くの場合、バッククォートが含まれますhttp://dev.mysql.com/doc/refman/5.6/en/identifiers.html

SQLジェネレータで識別子のドキュメントを参照してください。シングルバッククォートと


ことを識別子としてU + 0000を除くBMP Unicode文字のいずれかシーケンスを使用するには、彼らは単に

  1. ダブルバッククォート
  2. サラウンドを持つすべてのバッククォートを交換することができます

    手作りのクエリを書くとき、私は(ほとんどの)MySQLの予約語を知っています。もっと短くて読みやすくなるので、できる限りバッククッキーを使用したくないのです。

    ほとんどの場合、それはちょうどスタイルの好みです。もちろん、dateMy Fieldのようなフィールドを持っていなければ、バッククックを使用する必要があります。

    1.けれどもはhttps://bugs.mysql.com/bug.php?id=68676

関連する問題