すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ケース鈍感

最終更新日:Jun 05, 2024

このトピックでは、PolarDB for PostgreSQL (Compatible with Oracle) の大文字と小文字を区別しない機能について説明します。

概要

デフォルトでは、OracleとPolarDB for PostgreSQL (Compatible with Oracle) では、データベースオブジェクトの名前の大文字化ルールが異なります。 二重引用符で囲まれていないオブジェクト名の場合、Oracleはそれらを大文字に変換し、PolarDB For PostgreSQL (Compatible with Oracle) はそれらを小文字に変換します。 オブジェクトを作成するステートメントでオブジェクト名が二重引用符で囲まれている場合、その名前はそのまま格納されます。 したがって、PolarDB for PostgreSQL (Compatible with Oracle) を初めて使用する一部のOracleユーザーは、ユーザーの習慣の違いにより問題が発生する可能性があります。 例:
  • テーブルtbl(id int) を作成します。select * from "TBL" where "ID" = 10; 
    Oracleでは、上記のCREATE TABLEステートメントを実行すると、テーブル名tblが自動的にTBLに変換されます。 TBLテーブルからデータを照会することを指定する文は、正常に実行できます。 ただし、PolarDB for PostgreSQL (Compatible with Oracle) でCREATE TABLE文を実行すると、テーブル名tblが小文字に格納されます。 したがって、TBLテーブルを含むSELECTステートメントは、テーブルが見つからないことを示すエラーを返します。
  • テーブル "TBL"("ID" int) を作成します。select * from TBL where ID = 10; 
    上記のクエリは、大文字の問題のため、PolarDB for PostgreSQL (Compatible with Oracle) でも実行できません。
大文字化の問題を解決し、OracleからPolarDB for PostgreSQL (Compatible with Oracle) への切り替えを容易にするために、PolarDB for PostgreSQL (Compatible with Oracle) はケース非感受性機能を提供します。 この機能を有効にすると、二重引用符で囲まれていないオブジェクト名、二重引用符で囲まれて大文字で書かれたオブジェクト名、二重引用符で囲まれて小文字で書かれたオブジェクト名と同等のオブジェクト名と見なされます。 たとえば、次の各ステートメントで作成されたテーブルと列の名前は同等と見なされます
。create table "TBL"("ID" int);

テーブルTBL(ID int) を作成します。テーブルtbl(id int) を作成します。テーブル "tbl"("id" int) を作成します。テーブルを作成Tbl (Id int); 
説明 二重引用符で囲まれ、小文字と大文字の両方で構成されるオブジェクト名は、この機能の影響を受けません。 例:
テーブル "Tbl" ("Id" int) を作成します。select * from "Tbl" where "Id" = 1; 

使用上の注意

  • コンソールでpolar_case_sensitive_for_columnrefパラメーターを次のいずれかの値に設定して、ケース非感受性機能を有効または無効にできます。
    • on: ケース非感受性機能が有効になっています。
    • off: ケース鈍感機能は無効です。
    説明 デフォルトでは、マイナーバージョン1.1.24が7月2022日にリリースされた後に作成されたクラスターでは、ケース非依存機能が有効になります。
  • マイナーバージョン1.1.24が7月2022日にリリースされる前に作成されたクラスターの場合、クラスター内のデータベース、スキーマ、テーブル、または列が異なるケースで同じ文字を含む名前を使用しているかどうかを判断できない場合は、ケース非依存機能を有効にしないでください。 それ以外の場合、誤ったクエリ結果が返されます。
  • 同じ文字を含むオブジェクト名を異なるケースで指定しないことを推奨します。
  • クエリで、名前が同じ文字を含む列を持つテーブルが異なる場合は、<Table name.Column name> 形式で列に名前を付けるか、列のエイリアスを使用することをお勧めします。
  • テーブルが作成された既存のクラスターでこの機能を有効にした後、これらのクラスターでDDLステートメントを実行するときは注意して続行することをお勧めします。 たとえば、"tbl" という名前のテーブルが既に存在するクラスターに対して、ケース非依存機能を有効にしたとします。 次に、次のCREATE TABLEステートメントを実行して、"TBL" という名前のテーブルを作成します。 DROP TABLE文を実行して "TBL" テーブルを削除すると、"tbl" と "TBL" という名前のテーブルは同等と見なされるため、両方のテーブルが削除されます。
    テーブル "tbl" (id int) を作成します。ドロップテーブル "TBL"; 

制限事項

大文字と小文字の区別機能は、次のオブジェクトの名前にのみ適用されます。

  • データベース
  • スキーマ
  • 共通テーブル式 (CTE) 、インデックス、ビュー、マテリアライズドビューなどのリレーショナルオブジェクトを含むテーブル
  • カラム
  • エイリアス
説明 関数やパッケージなどの他のオブジェクトは、大文字と小文字を区別しない機能ではサポートされません。