180

ここでいくつかの SQL の質問に対するいくつかの回答とコメントを読み、私の友人がそれらを禁止するポリシーを持つ場所で働いていると聞いた後、MySQL でフィールド名の周りにバッククォートを使用することに問題があるかどうか疑問に思っています.

あれは:

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

11 に答える 11

157

バッククォートを使用すると、代替文字を使用できます。クエリの作成ではそれほど問題ではありませんが、バッククォートを使用できると仮定すると、次のようなばかげたもので逃げることができると思います

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

もちろん、これは不適切な名前のテーブルを生成します。

簡潔に言うと、問題はありません。クエリをそのまま実行すると、次のようになります。

EXPLAIN EXTENDED Select foo,bar,baz 

返される生成された警告には、バックティック完全修飾テーブル名が含まれます。したがって、クエリ生成機能とクエリの自動再書き込みを使用している場合、バッククォートを使用すると、コードの解析が混乱しにくくなります。

ただし、バッククォートを使用できるかどうかを強制するのではなく、名前の基準を設定する必要があると思います。より「現実的な」問題を解決します。

于 2008-11-04T10:36:21.373 に答える
58

バッククォートの唯一の問題は、ANSI-SQL に準拠していないことです。たとえば、SQL Server では機能しません。

SQL を別のデータベースに移植する必要がある場合は、二重引用符を使用してください。

于 2008-11-04T10:36:03.793 に答える
46

私にとって、フィールド名を扱うときに常にそれらを使用することは非常に理にかなっています。

  • まず、一度習慣になれば、バックティック キーを押すだけでも問題ありません。
  • 次に、クエリのフィールドが正確に何であるか、およびキーワードまたはメソッドが何であるかを簡単に確認できます。
  • 最後に、テーブルを設計するときに、任意のフィールド名を使用できます。フィールドに「キー」、「順序」、または「値」という名前を付けることが非常に理にかなっている場合があります...これらはすべて、それらを参照するときにバッククォートが必要です。
于 2008-11-04T10:34:30.753 に答える
28

バッククォートは、標準の ANSI SQL の一部ではありません。mysqlマニュアルから:

ANSI_QUOTES SQL モードが有効になっている場合は、二重引用符で識別子を引用することもできます

したがって、バックティックを使用してから MySQL から離れることを決定した場合、問題が発生します (ただし、おそらくもっと大きな問題も発生する可能性があります)。

于 2008-11-04T10:37:31.933 に答える
9

MYSQLを使い続けても、クエリの視覚的な曖昧さを除けば、何も問題はありません。ただし、テーブル名および列名として予約済みキーワードまたは埋め込みスペースを使用することはできます。これはほとんどのデータベースエンジンではノーノーであり、後で移行することはできません。

読みやすさに関しては、多くの人がSQLキーワードにキャップを使用しています。

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
于 2008-11-04T10:40:28.667 に答える
6

私に尋ねると、常にバッククォートを使用する必要があります。しかし、チームがそれらを使用したくない理由がいくつかあります。

利点:

  • それらを使用すると、予約語や禁止文字はありません。
  • 場合によっては、より詳細なエラー メッセージが表示されます。
  • 悪い慣行を回避する場合は気にしませんが...実際には、SQL インジェクションを回避するための適切な方法である場合があります。

短所:

  • それらは標準ではなく、通常は移植できません。ただし、識別子の一部としてバックティックを使用しない限り (これは私が想像できる最悪の方法です)、バックティックを自動的に削除してクエリを移植できます。
  • クエリの一部が Access からのものである場合、テーブル名が " で引用されている可能性があります (すべての " をやみくもに削除することはできません)。ただし、バッククォートと二重引用符の混合は許可されています。
  • 一部の愚かなソフトウェアまたは関数は、クエリをフィルタリングし、バッククォートに問題があります。ただし、これらは ASCII の一部であるため、ソフトウェア/機能が非常に悪いことを意味します。
于 2012-10-07T14:32:59.663 に答える
4

バッククォートでコードベースを検索する方がはるかに簡単です。という名前のテーブルがあるとしますeventgrep -r "event" *何百もの結果が返される可能性があります。grep -r "\`event\`" *おそらくあなたのデータベースを参照しているものを返します。

于 2010-08-30T20:39:31.010 に答える
3

私の知る限り、バッククォートを使用する目的は、予約済みのキーワードと一致する名前を使用できるようにすることです。そのため、名前が予約済みのキーワードと衝突していない場合、バッククォートを使用する理由がわかりません。しかし、それはそれらを禁止する理由にもなりません。

于 2008-11-04T10:33:29.773 に答える
2

バックティック``についての簡単なことは、database_name、table_name などの識別子を示すために使用され、文字列リテラルには一重引用符''、二重引用符""が使用されますが、 "" は値をそのまま出力するために使用され、 '' 値変数は保持または保持されます。別のケースでは、彼が持っているテキストを印刷します。

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..
于 2017-08-23T11:42:18.627 に答える
0

"status" などのデフォルトの mysql または mssql 値としていくつかのフィールド名を使用している場合は、バッククォート ( "select statusfrom table_name" または "select id from table_name where status=1" ) を使用する必要があります。mysql がエラーを返すか、クエリが機能しないためです。

于 2015-04-09T07:19:21.453 に答える