web-dev-qa-db-ja.com

SQL標準はbacktick( `)の使用について何と言っていますか?

_PHP/MySQL_でmysql_query()を使用して単純なSQLクエリをデバッグするのに何時間も費やした後、テーブル名の周りのbactickを見逃したことに気づきました。それ以来、私は常にテーブル名の周りでそれを使用していました。

しかし、_SQLite/C++_で同じものを使用した場合、記号は認識されません。これを使うかどうか、混乱しますか?標準はそれの使用法について何と言っていますか?

また、引用符を使用する場合と使用しない場合を誰かに教えてもらえると便利です。値とフィールド名の周りを意味します。

44
Shubham

SQL標準(現在のバージョンはISO/IEC 9075:2011、複数の部分で)は、「バックティック」または「バッククォート」記号(Unicode U +0060またはGraveACCENT)については何も述べていません。 SQLに表示される可能性のある特別な意味を持つ文字としては認識されません。

識別子を引用するための標準SQLメカニズムは、二重引用符で囲まれた区切り識別子を使用します。

SELECT "select" FROM "from" WHERE "where" = "group by";

MySQLでは、次のように記述されている可能性があります。

SELECT `select` FROM `from` WHERE `where` = `group by`;

MS SQL Serverでは、次のように記述されている可能性があります。

SELECT [select] FROM [from] WHERE [where] = [group by];

SQL標準表記の問題は、Cプログラマーが文字列を二重引用符で囲むことに慣れているため、ほとんどのDBMSは、標準で認識される一重引用符の代わりに二重引用符を使用することです。しかし、それでは、識別子を囲みたいときに問題が発生します。

Microsoftは1つのアプローチを採用しました。 MySQLは別のものを取りました。 Informixでは、一重引用符と二重引用符を交換して使用できますが、区切り識別子が必要な場合は、環境変数を設定してから、標準(文字列には一重引用符、識別子には二重引用符)に従う必要があります。 DB2は、標準のAFAIKのみに従います。 SQLiteは標準に従っているようです。 Oracleも標準に従っているようです。 Sybaseでは、二重引用符(標準)または角括弧のいずれかが許可されているようです(MS SQL Serverの場合と同様、SQL Serverでも二重引用符が許可される場合があります)。この page は、これらすべてのサーバーを文書化し(そして、私の知識のギャップを埋めるのに役立ちました)、区切られた識別子内の文字列が大文字と小文字を区別するかどうかを示します。


識別子の周りに引用メカニズムをいつ使用するかについては、私の態度は「決して」ではありません。まあ、決してそうなることはありませんが、絶対にそうすることを余儀なくされたときだけです。

区切られた識別子では大文字と小文字が区別されることに注意してください。あれは、 "from"および"FROM"異なる列を参照します(ほとんどのDBMSで—上記のURLを参照)。 SQLのほとんどは大文字と小文字を区別しません。どのケースを使用するかを知るのは面倒です。 (SQL標準にはメインフレームの方向性があります。名前は大文字に変換されると想定されていますが、ほとんどのDBMSは名前を小文字に変換します。)

一般に、キーワードである識別子は、使用しているSQLのバージョンに区切る必要があります。つまり、 標準SQL のほとんどのキーワードに加えて、使用している特定の実装の一部である追加のキーワードがあります。

継続的な問題の原因の1つはアップグレードです。この場合、リリースNでキーワードではなかった列名が、リリースN +1でキーワードになります。アップグレード前に機能していた既存のSQLは、アップグレード後に機能しなくなります。次に、少なくとも短期的な対策として、名前を引用することを余儀なくされる可能性があります。ただし、通常のイベントでは、識別子を引用する必要がないようにする必要があります。

もちろん、私の態度は、Informix(私が主に使用しているもの)がこのSQLを逐語的に受け入れるのに対し、ほとんどのDBMSはそれに窒息するという事実によって色付けされています。

CREATE TABLE TABLE
(
    DATE    INTEGER NOT NULL,
    NULL    FLOAT   NOT NULL,
    FLOAT   INTEGER NOT NULL,
    NOT     DATE    NOT NULL,
    INTEGER FLOAT   NOT NULL
);

もちろん、デモンストレーション目的以外の目的でこのようなばかげたテーブルを作成する人は、吊るし、描画し、四分の一にし、残りを作成して、作成した混乱を修正する必要があります。しかし、顧客が日常的にヒットすることができるいくつかの制限内で、キーワードは多くのコンテキストで識別子として使用できます。つまり、それ自体が将来を保証する便利な形式です。 Wordがキーワードになった場合、既存のコードが変更の影響を受けずに機能し続ける可能性は中程度です。ただし、メカニズムは完全ではありません。 PRIMARYという列を持つテーブルを作成することはできませんが、そのような列を追加するようにテーブルを変更することはできます。特異性には理由がありますが、説明するのは難しいです。

76