Oracleが大文字と小文字を区別し、SQL Serverのような他のものとMySQLがデフォルトではない理由はありますか?
大文字と小文字の区別を有効/無効にする方法があることは知っていますが、Oracleが他のデータベースと異なるのは奇妙に思えます。
また、大文字と小文字を区別する理由を理解しようとしています。 「テーブル」と「TaBlE」が同等であり、同等ではないと見なすことができますが、大文字と小文字の区別によって実際に違いが生じる例はありますか?
私はデータベースに多少慣れていないので、現在授業を受けています。
デフォルトでは、Oracle識別子(テーブル名、列名など)は大文字と小文字を区別しませんinsensitive。引用符を使用して、大文字と小文字を区別できます(例:SELECT * FROM "My_Table" WHERE "my_field" = 1
)。 SQLキーワード(SELECT
、WHERE
、JOIN
など)は常に大文字と小文字を区別しません。
一方、文字列の比較では大文字と小文字が区別されますsensitive(例:WHERE field='STRING'
は'STRING'
の列にのみ一致します)デフォルト。 NLS_COMP
とNLS_SORT
を適切な値に設定することで、大文字と小文字を区別しないようにできます(例:LINGUISTIC
とBINARY_CI
)。
注:データディクショナリビューを照会するとき(例:
dba_tables
)、引用符なしで作成した場合、名前は大文字になり、2番目の段落で説明した文字列比較規則がここに適用されます。
一部のデータベース(Oracle、IBM DB2、PostgreSQLなど)は、デフォルトで大文字と小文字を区別する文字列比較を実行し、他のデータベースは大文字と小文字を区別しません(SQL Server、MySQL、SQLite)。これは決して標準ではないので、dbの設定が何であるかに注意してください。
実際には、識別子を引用符で囲まない限り、Oracleはフィールド名とテーブル名を大文字と小文字を区別しない方法で処理します。名前を引用符で囲まずにテーブルを作成すると(CREATE MyTable ...など)、結果のテーブル名は大文字(つまり、MYTABLE)に変換され、大文字と小文字を区別しない方法で処理されます。 MYTABLEからのSELECT *、MyTableからのSELECT *、myTabLeからのSELECT *は、すべてMYTABLEと一致します(テーブル名の前後に引用符がないことに注意してください)。 この問題に関する素敵な記事 は、この問題をより詳細に議論し、データベースを比較しています。
推測する必要がある場合は、歴史的/後方互換性の理由で言うでしょう。
Oracle は1977年に最初に登場しました。当時のテクノロジーでは、大文字と小文字を区別しない検索のために余分な作業を行うため、計算コストが高くなりそうでした。完全一致を選択しました。
SQL Serverについても、大文字と小文字の区別は照合に基づいていることに注意してください。デフォルトの照合では大文字と小文字は区別されませんが、大文字と小文字を区別するように変更できます。同様の例として、非ASCII文字を使用するグローバルアプリケーションにUTFが必要な場合に、デフォルトのOracleデータベースが西ヨーロッパ文字セットを使用するのはなぜですか?.
一部のアプリケーションでは大文字と小文字が区別されますが、他のアプリケーションでは重要ではありません。どちらのDBMSを使用する場合でも、ビジネス要件により、大文字と小文字を区別する必要があるかどうかを判断する必要があります。 「デフォルト」についてはあまり心配しません。