SQLは大文字と小文字を区別します。私はMySQLとSQL Serverを使用しましたが、どちらも大文字と小文字が区別されないようです。これは常にそうですか?規格では大文字と小文字の区別が定義されていますか?
SQLは大文字と小文字を区別します。私はMySQLとSQL Serverを使用しましたが、どちらも大文字と小文字が区別されないようです。これは常にそうですか?規格では大文字と小文字の区別が定義されていますか?
回答:
SQLキーワードは大文字と小文字を区別しない(しているSELECT
、FROM
、WHERE
、など)が、しばしばすべて大文字で書かれています。ただし、一部の設定では、テーブル名と列名で大文字と小文字が区別されます。MySQLには、それを有効/無効にする設定オプションがあります。通常、大文字と小文字を区別するテーブルと列の名前はLinux MySQLのデフォルトであり、大文字と小文字を区別しないがWindowsのデフォルトでしたが、インストーラーはセットアップ中にこれについて尋ねました。MSSQLの場合、これはデータベースの照合設定の関数です。
SQL Server ではオプションです。それをオンにするのは大変です。
MySqlについてはわかりません。
SQL92の仕様では、識別子が引用されるかもしれないと述べている、または引用符で囲まれていません。両側が引用符で囲まれていない場合、それらは常に大文字と小文字を区別しませんtable_name == TAble_nAmE
。
ただし、引用識別子は大文字と小文字を区別し"table_name" != "TAble_naME"
ます。また例えば、あなたが引用されたものでunqouted識別子を比較したい場合は引用符で囲まれていない文字が大文字にしている場合は、引用符で囲まれていないと、引用符で囲まれた識別子は、同じと考えることができる仕様に基づいて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選択など)を混在させる場合アプリケーションで)特に大文字と小文字を区別しない識別子が異なるデータベース(DB2、PostgreSQLなど)では、大文字と小文字が一致していることを確認する必要があります。
私の理解では、SQL標準では大文字と小文字を区別しません。ただし、どのデータベースも完全に標準に準拠しているとは思わない。
MySQLには、大文字と小文字を区別する、または区別しないテーブル名の「strictモード」(MySQLをより標準に準拠させるいくつかの設定のグラブバッグ)の一部としての構成設定があります。この設定に関係なく、列名は大文字と小文字を区別しませんが、列名の表示方法に影響すると思います。この設定はRDBMSインスタンス内のすべてのデータベースでインスタンス全体に適用されると思いますが、本日調査してこれを確認しています(答えがノーであることを期待しています)。
Oracleがこれをよりよく処理する方法が好きです。ストレートSQLでは、テーブル名や列名などの識別子は大文字と小文字を区別しません。ただし、何らかの理由で明示的に大文字と小文字を区別したい場合は、識別子を二重引用符で囲むことができます(Oracle SQLでは、文字列データを囲むために使用される単一引用符とはまったく異なります)。そう:
SELECT fieldName
FROM tableName;
tablenameからfieldnameをクエリしますが、
SELECT "fieldName"
FROM "tableName";
tableNameからfieldNameをクエリします。
このメカニズムを使用して、スペースやその他の非標準文字を識別子に挿入することもできると思います。
この状況で、何らかの理由で明示的に大文字と小文字が区別されるテーブルと列の名前が望ましい場合は、それが利用可能でしたが、それでも私は強く警告します。
Oracleを日常的に使用するときの慣例では、コードではすべてのOracle SQLキーワードを大文字に、すべての識別子を小文字にした。ドキュメントでは、すべてのテーブル名と列名を大文字で表記します。これを実行できることは非常に便利で読みやすいものでした(ただし、コードに非常に多くの大文字を入力するのは面倒ですが、ここで役立つエディタ機能を見つけることができたはずです)。
私の意見では、MySQLは異なるプラットフォームでこれを区別するのに特に悪いです。WindowsでデータベースをダンプしてUNIXにロードできる必要があります。これは、WindowsのインストーラーがRDBMSを大文字と小文字を区別するモードにするのを忘れた場合の災害です。(公平に言うと、これが災害である理由の一部は、プログラマーがUNIXでのMySQLの大文字と小文字の区別に依存するという誤った決定をしたことです。)Windows MySQLインストーラーを作成した人々は、これを非常に便利にして、 Windowsライクで、「厳格モードをオンにしてMySQLをより標準に準拠させたいですか?」しかし、MySQLが標準と大きく異なることは非常に便利です。そして、別のプラットフォームでの独自の事実上の標準と向きを変え、異なるものにすることで、事態をさらに悪化させます。異なるディストリビューションのパッケージャーはおそらく独自の優先MySQL構成設定を組み込んでいる可能性があるため、異なるLinuxディストリビューションではさらに複雑になる可能性があります。
ここでは、RDBMSで大文字と小文字の区別が望ましいかどうかを議論するための別のSOの質問があります。
私はこのブログの投稿が非常に役立つことがわかりました(私は著者ではありません)。要約(ただし、お読みください):
...区切り識別子は大文字と小文字を区別しますが( "table_name"!= "Table_Name")、引用符で囲まれていない識別子はそうではなく、大文字に変換されます(table_name => TABLE_NAME)。
彼は、DB2、Oracle、Interbase / Firebirdが100%準拠していることを発見しました。
PostgreSQL ...引用符で囲まれていない識別子はすべて大文字ではなく小文字にします。MySQL ...ファイルシステムに依存。SQLiteとSQL Server ...のテーブル名とフィールド名の大文字小文字は作成時に保持されますが、その後は完全に無視されます。
SQLキーワード自体は、大文字と小文字を区別しません。
テーブル、カラムなどの名前は大文字と小文字が区別されるため、データベースに依存します-特に知らない限り、それらは大文字と小文字が区別されると想定する必要があります(多くのデータベースではそうではありません。MySQLでは、テーブル名はSOMETIMESで大文字と小文字が区別されますが、その他のほとんど名前はありません)。
=、>、<などを使用してデータを比較すると、個々のデータベース、テーブル、または問題の列で使用されている照合設定に依存するケース認識があります。ただし、データベース内で照合の一貫性を保つことは正常です。大文字と小文字を区別する値を格納する必要があるいくつかの列があります。照合が明確に設定されています。