SQL構文では大文字と小文字が区別されますか?


回答:


181

SQLキーワードは大文字と小文字を区別しない(しているSELECTFROMWHERE、など)が、しばしばすべて大文字で書かれています。ただし、一部の設定では、テーブル名と列名で大文字と小文字が区別されます。MySQLには、それを有効/無効にする設定オプションがあります。通常、大文字と小文字を区別するテーブルと列の名前はLinux MySQLのデフォルトであり、大文字と小文字を区別しないがWindowsのデフォルトでしたが、インストーラーはセットアップ中にこれについて尋ねました。MSSQLの場合、これはデータベースの照合設定の関数です。

ここで名前の大文字と小文字の区別についてのMySQLのページには、

MSSQLの照合順序に関するMSDN記事は次のとおりです


7
一部のシステム(PostgreSQLなど)は、テーブル名と列名で大文字と小文字を区別しますが、検索する前にすべての名前を小文字または大文字で隠そうとします。これらのシステムでは、入力した正確な名前が確実に検索されるように、テーブル名を「二重引用符」で囲む必要があります。
Michael Ratanapintha

2
「しかし、多くの場合、すべて大文字で書かれている」私はそうは思わない、それは単なる好みであり、私は常に実際にはその反対を見てきた
BlackTigerX

3
たとえば、MS Sqlサーバーが大文字と小文字を区別する照合を使用してインストールされている場合、データベースで大文字と小文字を区別しない照合であっても、テーブル、列、変数名は大文字と小文字を区別します。
Vadym Stetsiak 2009

3
@BlackTigerX-Oracleのマニュアルには、キーワード(SELECT、FROM、WHEREなど)が大文字で記述されているSQLの例がすべて含まれていますが、テーブル名と列名は小文字で記述されています。
J. Polfer、2010年

うーん、これはまだmysqlに当てはまりますか?私はmysqlのデフォルトのインストールがあると思いました。列名の大文字と小文字は区別されません。
Kzqai

22

これは厳密にはSQL言語ではありませんが、SQL Serverでは、データベースの照合順序で大文字と小文字が区別される場合、すべてのテーブル名で大文字と小文字が区別されます。


16

SQL Server ではオプションです。それをオンにするのは大変です。

MySqlについてはわかりません。


MySqlでは、大文字と小文字の区別はオンとオフを切り替えることができるオプションです。ファイルシステムで大文字と小文字が区別される場合(デフォルト)、Linuxでそうであると想定しているように、その非依存性は機能しません。mysqlの大文字と小文字を区別しないようにするには、Linuxで大文字と小文字を区別しないファイルシステムを作成する必要があります。特に、別のモードでの作業後にオン/オフを切り替えると、悪影響が生じる可能性があります。
Stefan Steiger 14

14

識別子と予約語では大文字と小文字が区別されませんが、予約語には大文字を使用し、識別子にはPascalの大文字と小文字を使用するという慣例に従っています。

SQL-92 Secを参照してください。5.2


13

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など)では、大文字と小文字が一致していることを確認する必要があります。


10

私の理解では、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の質問があります。


5

いいえ。MySQLでは大文字と小文字が区別されず、SQL標準でも区別されません。コマンドを大文字で書くのは一般的な慣例です。

さて、もしあなたがテーブル/カラム名について話しているなら、そうです、そうですが、コマンド自体ではありません。

そう

SELECT * FROM foo;

と同じです

select * from foo;

しかし同じではありません

select * from FOO;

2
ほとんどのRDBMSでは、テーブル名も大文字と小文字を区別しません。少なくともデフォルトではそうではありません。MySQLはこのルールの最も顕著な例外です。

4

私はこのブログの投稿が非常に役立つことがわかりました(私は著者ではありません)。要約(ただし、お読みください):

...区切り識別子は大文字と小文字を区別しますが( "table_name"!= "Table_Name")、引用符で囲まれていない識別子はそうではなく、大文字に変換されます(table_name => TABLE_NAME)。

彼は、DB2、Oracle、Interbase / Firebirdが100%準拠していることを発見しました。

PostgreSQL ...引用符で囲まれていない識別子はすべて大文字ではなく小文字にします。MySQL ...ファイルシステムに依存。SQLiteとSQL Server ...のテーブル名とフィールド名の大文字小文字は作成時に保持されますが、その後は完全に無視されます。


2

SQL Serverは大文字と小文字を区別しないと思います。少なくともデフォルトではそうではありません。

Management Studioを介して手動でクエリを実行しているときは、常に大文字と小文字を間違え、陽気に受け入れます。

select cOL1, col2 FrOM taBLeName WheRE ...

2

SQLキーワード自体は、大文字と小文字を区別しません。

テーブル、カラムなどの名前は大文字と小文字が区別されるため、データベースに依存します-特に知らない限り、それらは大文字と小文字が区別されると想定する必要があります(多くのデータベースではそうではありません。MySQLでは、テーブル名はSOMETIMESで大文字と小文字が区別されますが、その他のほとんど名前はありません)。

=、>、<などを使用してデータを比較すると、個々のデータベース、テーブル、または問題の列で使用されている照合設定に依存するケース認識があります。ただし、データベース内で照合の一貫性を保つことは正常です。大文字と小文字を区別する値を格納する必要があるいくつかの列があります。照合が明確に設定されています。


0

両方の長所を持っている

最近では、すべてのSQLステートメントを小文字で書くことができ、それをフォーマットする必要がある場合は、それを行うプラグインをインストールするだけです。これは、コードエディターにこれらのプラグインが利用可能な場合にのみ適用されます。 VSCodeには、これを実行できる多くの拡張機能があります。

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