フィールド名をバッククォートで囲む


172

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

あれは:

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

24
あなたは、列のような名前にしたい場合はバッククォートは本当に便利ですcounttypetableまたは類似
knittl


@knittl私は、問題があると考えなければならない次のような列名を持っているcounttypetable。これらは非常にあいまいな用語であり、ほとんどすべての場合、これらの名前はより具体的になるように改善できます。列に名前を付けることも危険であり、エラーが発生する可能性があります。誰かがバックティックの追加を忘れたり、バックティックを追加する必要があることに気付かない場合があるためです。予約語を列名として使用しないことをお勧めします。
dallin '19年

私は常にそれらを使用しているので、いつでも予約済みキーワードを使用しても危険にさらされていません。
Markus Zeller、2018年

回答:


153

バックティックを使用すると、代替文字を使用できます。クエリの記述ではそれはそのような問題ではありませんが、バッククォートを使用できると仮定すると、次のようなとんでもないことを回避できると思います

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

もちろん、どちらが悪い名前のテーブルを生成しますか。

簡潔にしているだけなら問題はないと思いますが、クエリをそのように実行するかどうかを確認します

EXPLAIN EXTENDED Select foo,bar,baz 

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

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


PostgreSQLでも使用する必要がありますか?
Yousuf Memon

5
必要はなく、推奨のみです。後でフィールド名を共有するSQLキーワードが追加される場合に、SQLキーワードとのあいまいさを避けるために、引用符でそれらを表すことは有用です。引用のあなた/必要性/唯一の時間は、フィールドがときある例えば、キーワード名を共有し、select count from fooselect "count" from foo非常に異なる結果が得られます。しかし、postgresはmysqlと次の2つの点で異なります。1.フィールドはによって引用され""ます。2.非上場のフィールドは大文字と小文字を区別しませんpostgresql.org/docs/current/static/...
ケントフレドリック

57

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

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


15
うん。MySQLのANSIモード(dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html)を使用して、MySQLで二重引用符を有効にし、データベース間の互換性を取り戻します。今後のDBMSバージョンで予約語になる予定がわからないため、バッククォート/引用符も必要です。
ボビンス2008年

1
それは本当です!新しいキーワードを追加したデータベースエンジンにアップグレードを適用するまで、サーバーアプリケーションの1つは問題なく動作していました。突然、特定のテーブルを照会したすべてが壊れました。
ミケラ2008年

私がいたとき@bobince 新しい DEVに、私は、列の名前rangeまたはそのような何かを。MySQL 5にアップグレードしたとき、それは新しい予約語だったので失敗しました。
alex

1
二重引用符は使用しないでください。常に機能するとは限りません。たとえば... DELETE FROM app_key_storesWHERE( "key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); クエリは正常、0行が影響を受けた(0.00秒)DELETE FROM app_key_storesWHERE(key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); クエリは
正常

44

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

  • まず、一度習慣になったら、バックティックキーを押すだけで問題ありません。
  • 次に、私にとっては、クエリ内のフィールドとは何か、キーワードやメソッドとは何かを簡単に確認できるようになります。
  • 最後に、テーブルを設計するときに、任意のフィールド名を使用できます。場合によっては、フィールドに「キー」、「順序」、または「値」という名前を付けるのが理にかなっています...それらを参照するときは、すべてバッククォートが必要です。

19
また、将来使用される予約語(以前に私を噛んだ)から保護することも追加する必要があります。
alex

5
私が実際に誰かに私の質問の1つから余分なバッククォートを一度編集してもらいました。これは私を混乱させました。この理由は、すべての変数をそれらで囲む正確な理由です
Brian Leishman

2
また、英語以外のラベルを安全に使用することもできます。これだけで、バックティックの使用を促進できます。
Aternus

26

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

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

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


9

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

読みやすいように、多くの人はSQLキーワードに大文字を使用します。

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

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

利点:

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

短所:

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

9
バックティックの使用は、SQLインジェクションの回避とはまったく関係ありません。
アンディレスター

6
@andy 攻撃者は別のバックティックで挿入して閉じる必要があるため、役立つ可能性があります。それはほとんど何もしませんが、それはまだ何かです
jasonszhao

4

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


一般に、それは実際にはメリットではありません。専門家が遭遇するテーブルの名前は、「一般」ではなく、new_users_infoのようになっています。
ankush981 2015

3

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


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..

0

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


0

SQLでのバッククォート( `)の主な用途は、次の句でそれらを再び呼び出す状況で使用することです。それ以外の場合は、二重引用符( "")を使用することをお勧めします。

例えば

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 LocationGROUP BY句で再びどのように使用されているかを確認します。

使用する代わりに

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

使ったばかり

GROUP BY Publisher and Location

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.