SQLでは大文字と小文字が区別されます。 MySQLとSQL Serverを使用しましたが、どちらも大文字と小文字を区別しないようです。これは常にそうですか?標準では大文字と小文字が区別されますか?
SQLキーワードは大文字と小文字を区別しません(SELECT
、FROM
、WHERE
など)が、多くの場合、すべて大文字で記述されます。ただし、一部のセットアップでは、テーブル名と列名は大文字と小文字が区別されます。 MySQLには、有効化/無効化する構成オプションがあります。通常、Linux MySQLでは大文字と小文字が区別されるテーブル名と列名がデフォルトであり、Windowsではデフォルトで大文字と小文字が区別されませんでしたが、インストーラーはセットアップ中にこれについて尋ねました。 MSSQLの場合、データベースの照合設定の関数です。
これは厳密にはSQL言語ではありませんが、SQL Serverでは、データベースの照合で大文字と小文字が区別される場合、すべてのテーブル名で大文字と小文字が区別されます。
Sql Serverで オプションです 。オンにするのは最悪です。
MySqlについてはわかりません。
識別子と予約語は大文字と小文字を区別してはいけませんが、多くは予約語に大文字を使用し、識別子にPascalの大文字を使用する規則に従っています。
SQL-92 Secを参照してください。 5.2
SQL92仕様 は、識別子が引用される場合と引用されない場合があることを示しています。両側が引用符で囲まれていない場合、それらは常に大文字と小文字を区別しません。 table_name == TAble_nAmE
。
ただし、引用識別子は大文字と小文字が区別されます。 "table_name" != "TAble_naME"
。また、引用されていない文字を引用符で囲まれた識別子と比較する場合の仕様に基づいて、引用されていない文字が大文字である場合、引用されていない識別子と引用された識別子は同じとみなすことができます。 TABLE_NAME == "TABLE_NAME"
、ただしTABLE_NAME != "table_name"
またはTABLE_NAME != "TAble_NaMe"
。
仕様の関連部分は次のとおりです(セクション5.2.13)。
13)A <regular identifier> and a <delimited identifier> are equiva-
lent if the <identifier body> of the <regular identifier> (with
every letter that is a lower-case letter replaced by the equiva-
lent upper-case letter or letters) and the <delimited identifier
body> of the <delimited identifier> (with all occurrences of
<quote> replaced by <quote symbol> and all occurrences of <dou-
blequote symbol> replaced by <double quote>), considered as
the repetition of a <character string literal> that specifies a
<character set specification> of SQL_TEXT and an implementation-
defined collation that is sensitive to case, compare equally
according to the comparison rules in Subclause 8.2, "<comparison
predicate>".
SQL標準の他の部分と同様に、すべてのデータベースがこのセクションに完全に従うわけではないことに注意してください。たとえば、PostgreSQLは、引用符で囲まれていないすべての識別子を大文字ではなく小文字で保存するため、table_name == "table_name"
(これは標準とは正反対です)。また、一部のデータベースは常に大文字と小文字を区別しません。または、大文字と小文字の区別はDBの設定に依存するか、システムの一部のプロパティに依存します。通常、ファイルシステムは大文字と小文字を区別します。
一部のデータベースツールは常に引用符で囲まれた識別子を送信する可能性があるため、何らかのツール(Liquibaseや他のDB移行ツールで生成されたCREATE TABLEクエリなど)で生成されたクエリと、手作りのクエリ(単純なJDBC selectアプリケーション内)、特に引用符付き識別子と引用符なし識別子が異なるデータベース(DB2、PostgreSQLなど)で、ケースが一貫していることを確認する必要があります
私の理解では、SQL標準では大文字と小文字を区別しないことが求められています。ただし、データベースが標準に完全に準拠しているとは思わない。
MySQLには、大文字と小文字を区別する、または区別しないテーブル名の「厳格モード」(MySQLをより標準に準拠させるいくつかの設定のグラブバッグ)の一部として構成設定があります。この設定に関係なく、列名は大文字と小文字を区別しませんが、列名の表示方法に影響すると思います。この設定は、RDBMSインスタンス内のすべてのデータベースでインスタンス全体に適用されると考えていますが、これを確認するために今日調査しています(そして、答えがノーであることを願っています)。
Oracleがこれをより良く処理する方法が気に入っています。ストレートSQLでは、テーブル名や列名のような識別子は大文字と小文字を区別しません。ただし、何らかの理由で明示的な大文字小文字の区別を本当に望む場合は、識別子を二重引用符で囲むことができます(Oracle SQLでは、文字列データを囲むために使用される単一引用符とはまったく異なります)。そう:
SELECT fieldName
FROM tableName;
fieldnameからtablenameをクエリしますが、
SELECT "fieldName"
FROM "tableName";
クエリfieldNamefromtableName.
このメカニズムを使用して、スペースやその他の非標準文字を識別子に挿入することもできると確信しています。
この状況では、何らかの理由で明示的に大文字と小文字を区別したテーブル名と列名が必要な場合に利用できますが、それでも私は非常に注意する必要があります。
私が日常的にOracleを使用していたときの慣習では、コードではすべてのOracle SQLキーワードを大文字で、すべての識別子を小文字で入力していました。ドキュメントでは、すべてのテーブル名と列名を大文字にします。これを行うことができるのは非常に便利で読みやすいです(コードに非常に多くの大文字を入力するのは時々苦痛ですが、ここで役立つエディタ機能を見つけることができたと確信しています)。
私の意見では、MySQLは、プラットフォームごとに異なる点で特に悪いです。 WindowsでデータベースをダンプしてUNIXにロードできるようにする必要があります。WindowsのインストーラーがRDBMSを大文字と小文字を区別するモードにするのを忘れた場合、そうすることは災害です。 (公平に言うと、これが災害である理由の一部は、私たちのコーダーがずっと前に、UNIX上のMySQLの大文字と小文字の区別に依存するという悪い決定を下したことです。) Windowsに似ています。「厳格モードを有効にして、MySQLをより標準に準拠させますか?」しかし、MySQLが標準と大きく異なるのは非常に便利であり、異なるプラットフォームでデファクトスタンダードを変更して異なることで事態を悪化させます。異なるディストリビューションのパッケージャーは、おそらく自分の好みのMySQL構成設定を組み込んでいる可能性があるため、異なるLinuxディストリビューションではこれがさらに複雑になる可能性があると確信しています。
ここ の別のSOの質問で、RDBMSで大文字と小文字を区別することが望ましいかどうかを議論します。
このブログ投稿 は非常に役立つことがわかりました(著者ではありません)。要約(ただし、読んでください):
...区切り識別子は大文字と小文字を区別します( "table_name"!= "Table_Name")が、引用符で囲まれていない識別子は大文字ではなく、大文字に変換されます(table_name => TABLE_NAME)。
彼は、DB2、Oracle、およびInterbase/Firebirdが100%に準拠していることを発見しました。
PostgreSQL ...は、引用符で囲まれていないすべての識別子を大文字ではなく小文字にします。 MySQL ...ファイルシステムに依存。 SQLiteとSQL Server ...テーブルとフィールド名の大文字と小文字は作成時に保持されますが、その後は完全に無視されます。
いいえ。MySQLでは大文字と小文字が区別されず、SQL標準でもありません。コマンドを大文字で記述するのは一般的な方法です。
さて、もしあなたがテーブル/カラム名について話しているなら、そうです、しかしコマンドそのものではありません。
そう
SELECT * FROM foo;
と同じです
select * from foo;
しかし、同じではありません
select * from FOO;
SQLキーワードは、大文字と小文字を区別しません。
テーブル、列などの名前は、データベースに依存する大文字と小文字を区別します-知らない限り、おそらく大文字と小文字を区別すると仮定する必要があります(多くのデータベースではそうではありません。MySQLのテーブル名では大文字と小文字が区別されますが、名前はありません)。
=、>、<などを使用してデータを比較すると、問題の個々のデータベース、テーブル、または列で使用されている照合設定に依存するケース認識があります。ただし、データベース内で照合の一貫性を保つのは正常です。大文字と小文字を区別する値を保存する必要があるいくつかの列があります。照合が特別に設定されています。
少なくともデフォルトでは、SQL Serverは大文字と小文字を区別するとは思わない。
Management Studioを使用して手動でクエリを実行すると、常にケースがめちゃくちゃになり、喜んで受け入れられます。
select cOL1, col2 FrOM taBLeName WheRE ...