質問
ここでいくつかのSQLの質問に対するいくつかの回答とコメントを読み、私の友人が禁止されているポリシーのある場所で働いていると聞いた後、フィールドの周りにバックティックを使用することに何か問題があるのではないかと考えていますMySQLの名前。
つまり:
SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
解決
バックティックを使用すると、代替文字を使用できます。クエリの作成ではそれほど問題ではありませんが、逆ティックを使用できると仮定した場合、次のようなばかげたことを回避できると思います。
SELECT `id`, `my name`, `another field` , `field,with,comma`
もちろん、不適切な名前のテーブルが生成されます。
簡潔にするだけで問題ない場合は、 クエリをそのように実行するかどうかに注意してください
EXPLAIN EXTENDED Select foo,bar,baz
返される生成された警告には、バッククォートおよびの完全修飾テーブル名があります。そのため、クエリ生成機能とクエリの自動書き換えを使用している場合、バックティックを使用すると、コードの解析の混乱が少なくなります。
ただし、バックティックを使用できるかどうかを指定する代わりに、名前の標準を使用する必要があります。より多くの「実際の」問題を解決します。
他のヒント
バックティックの唯一の問題は、ANSI-SQLに準拠していないことです。 SQL Serverでは機能しません。
SQLを別のデータベースに移植する必要がある場合は、二重引用符を使用してください。
私にとって、フィールド名を扱うときに常に使用するのは理にかなっています。
- まず、習慣になれば、バックティックキーを押すだけで害はありません。
- 2番目に、クエリのフィールドとは何か、キーワードまたはメソッドとは何かを簡単に確認できます。
- 最後に、テーブルの設計時に任意のフィールド名を使用できます。フィールドに「キー」、「順序」、または「値」などの名前を付けることが非常に有効な場合があります。これらのすべてを参照するにはバッククォートが必要です。
バックティックは、標準のANSI SQLの一部ではありません。 mysqlマニュアルから:
ANSI_QUOTES SQLモードが 有効にすると、引用することもできます 二重引用符で囲まれた識別子
したがって、バックティックを使用してからMySQLから離れることを決めた場合、問題が発生します(おそらく、さらに大きな問題が発生します)
MYSQLを使用し続けても、クエリの視覚的な混乱を除いて、何も問題はありません。ただし、予約されたキーワードまたは埋め込みスペースをテーブル名および列名として使用できます。これは、ほとんどのデータベースエンジンでは不可であり、後で移行することはできません。
読みやすいように、多くの人はSQLキーワードにキャップを使用しています。
SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
あなたが私に尋ねる場合、バッククォートは常に使用されるべきです。しかし、チームがそれらを使用しないことを好むいくつかの理由があります。
利点:
- これらを使用すると、予約語や禁止文字はありません。
- 場合によっては、より詳細なエラーメッセージが表示されます。
- 悪い習慣を避ければ気にしないが、...本当の言葉で言えば、SQLインジェクションを避けるためのまともな方法です。
欠点:
- これらは標準ではなく、通常は移植性がありません。ただし、識別子の一部としてバックティックを使用しない限り(これは想像できる限り最悪の方法です)、バックティックを自動的に削除してクエリを移植できます。
- クエリの一部がAccessからのものである場合、テーブル名を"で引用する場合があります。 (そして、たぶんすべての"を削除することはできません)。ただし、逆引用符と二重引用符を混在させることはできます。
- 一部の愚かなソフトウェアまたは関数がクエリをフィルタリングし、バックティックに問題があります。ただし、これらはASCIIの一部であるため、これはソフトウェア/機能が非常に悪いことを意味します。
まあ、私が知る限り、バックティックを使用する目的は、予約キーワードと一致する名前を使用できるようにすることです。そのため、名前が予約済みのキーワードと衝突しない場合、バッククォートを使用する理由はわかりません。しかし、それは彼らを禁止する理由でもありません。
バッククォート内の何かをコードベースで検索する方がはるかに簡単です。 event
という名前のテーブルがあるとします。 grep -r" event" *
は何百もの結果を返す場合があります。 grep -r" \ `event \`" *
は、おそらくデータベースを参照するものをすべて返します。
バックティックに関する単純な要素 `` は、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..
デフォルトのmysqlまたはmssql値として一部のフィールド名を使用している場合(" status"など)、backticks(" select status
from table_name"または" select id from table_nameを使用する必要がありますここで、 status
= 1")。
mysqlがエラーを返すか、クエリを機能しないためです。
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;
上記のステートメントでは、 GROUP BY
句で PublisherとLocation
が再び使用されていることがわかります。
使用する代わりに
GROUP BYの名前、都市、状態コード
使用したばかり
GROUP BY
発行者と場所
このような状況が発生した場合にのみ、バックティックを使用すると便利です。それ以外の場合は、二重引用符を使用することをお勧めします。