web-dev-qa-db-ja.com

フィールド名の周りにバックティックを使用する

ここでいくつかのSQLの質問に対する回答とコメントをいくつか読んだ後、私の友人が禁止しているポリシーがある場所で働いていると聞いた後、MySQLでフィールド名の周りにバッククォートを使用することに何か問題があるのだろうかと考えています。

あれは:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
172
nickf

バックティックを使用すると、代替文字を使用できます。クエリの作成では、それはそのような問題ではありませんが、逆ティックを使用できると仮定した場合、次のようなばかげたものを回避できると思います。

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

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

簡潔にするだけで問題が発生しない場合は、クエリをそのように実行するかどうかを確認します。

EXPLAIN EXTENDED Select foo,bar,baz 

生成される警告には、逆ティックがありますand完全修飾テーブル名。そのため、クエリ生成機能とクエリの自動書き換えを使用している場合、バックティックを使用すると、コードの解析の混乱が少なくなります。

ただし、バックティックを使用できるかどうかを指示する代わりに、名前の標準を使用する必要があります。より多くの「実際の」問題を解決します。

152
Kent Fredric

バックティックの唯一の問題は、ANSI-SQLに準拠していないことです。 SQL Serverでは機能しません。

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

57

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

  • まず、習慣になれば、単にバックティックキーを押すだけで問題ありません。
  • 第二に、私にとっては、クエリのフィールドが正確に何であり、キーワードまたはメソッドが何であるかを簡単に確認できます。
  • 最後に、テーブルを設計するときに任意のフィールド名を使用できます。フィールドに「キー」、「順序」、または「値」という名前を付けるのが理にかなっている場合があります。
44
nickf

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

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

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

25
Greg

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
8

あなたが私に尋ねる場合、バックティックを常に使用する必要があります。しかし、チームがそれらを使用しないことを好むいくつかの理由があります。

利点:

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

短所:

  • それらは標準ではなく、通常はポータブルではありません。ただし、識別子の一部としてバックティックを使用しない限り(これは私が想像できる最悪の方法です)、バックティックを自動的に削除してクエリを移植できます。
  • クエリの一部がAccessからのものである場合、テーブル名を "で引用する場合があります(そして、すべての"を盲目的に削除できない場合があります)。ただし、逆引用符と二重引用符を混在させることはできます。
  • いくつかの愚かなソフトウェアや機能がクエリをフィルタリングし、逆戻りに問題があります。ただし、これらはASCIIの一部であるため、これはソフトウェア/機能が非常に悪いことを意味します。
6
Federico

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

4

バックベース内の何かをコードベースで検索する方がはるかに簡単です。 eventという名前のテーブルがあるとします。 grep -r "event" *は何百もの結果を返す場合があります。 grep -r "\`event\`" *は、おそらくデータベースを参照しているものをすべて返します。

4
EllisGL

バックティックに関する単純なこと``は、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..
2

SQLでのバッククォート( `)の主な用途は、今後の句でそれらを再度呼び出す場合に使用することです。 1つおきに二重引用符( "")を使用することをお勧めします。

例えば

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

上記のステートメントでは、Publisher and Location句でGROUP BYが再び使用される方法を確認できます。

代わりに

GROUP BY名前、都市、州コード

使ったばかり

GROUP BY Publisher and Location

このような状況が発生した場合にのみ、バックティックを使用すると便利です。それ以外の場合は、二重引用符を使用することをお勧めします。

0
Command

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

0
ysrtymz