Topik ini menjelaskan fitur ketidakpekaan terhadap huruf besar/kecil dari PolarDB for PostgreSQL (Compatible with Oracle).
Latar Belakang
Secara default, Oracle dan PolarDB for PostgreSQL (Compatible with Oracle) memiliki aturan kapitalisasi yang berbeda untuk nama objek database. Untuk nama objek tanpa tanda kutip ganda, Oracle mengubahnya menjadi huruf besar, sedangkan PolarDB for PostgreSQL (Compatible with Oracle) mengubahnya menjadi huruf kecil. Jika nama objek diapit tanda kutip ganda dalam pernyataan pembuatan objek, nama tersebut disimpan sesuai dengan penulisannya. Oleh karena itu, pengguna Oracle yang baru menggunakan PolarDB for PostgreSQL (Compatible with Oracle) mungkin mengalami masalah akibat perbedaan kebiasaan penulisan. Contoh:
CREATE TABLE test_table(id int); SELECT * FROM "TEST_TABLE" WHERE "ID" = 10;Di Oracle, saat pernyataan CREATE TABLE dieksekusi, nama tabel
test_tablesecara otomatis diubah menjadi TBL. Pernyataan yang menanyakan data dari tabel TBL dapat dieksekusi dengan normal. Namun, saat pernyataan CREATE TABLE dieksekusi di PolarDB for PostgreSQL (Compatible with Oracle), nama tabel tbl disimpan dalam huruf kecil. Akibatnya, pernyataan SELECT yang melibatkan tabelTEST_TABLEakan mengembalikan kesalahan karena tabel tidak ditemukan.CREATE TABLE "TEST_TABLE"(id int); SELECT * FROM test_table WHERE "ID" = 10;Pertanyaan serupa juga akan gagal dieksekusi di PolarDB for PostgreSQL (Compatible with Oracle) karena masalah kapitalisasi.
Untuk menyelesaikan masalah kapitalisasi dan mempermudah transisi dari Oracle ke PolarDB for PostgreSQL (Compatible with Oracle), PolarDB for PostgreSQL (Compatible with Oracle) menyediakan fitur ketidakpekaan terhadap huruf besar/kecil. Saat fitur ini diaktifkan, nama objek berikut dianggap setara: nama objek tanpa tanda kutip ganda, nama objek dengan tanda kutip ganda dalam huruf besar, serta nama objek dengan tanda kutip ganda dalam huruf kecil. Sebagai contoh, nama tabel dan kolom yang dibuat oleh pernyataan berikut dianggap setara dalam hal hasil:
SELECT * FROM test_table WHERE "ID" = 10;
SELECT * FROM "TEST_TABLE" WHERE "ID" = 10;
SELECT * FROM TEST_TABLE WHERE "ID" = 10;
SELECT * FROM "test_table" WHERE "ID" = 10;Nama objek dengan tanda kutip ganda yang mencampur huruf besar dan kecil tidak terpengaruh oleh fitur ini. Contoh:
CREATE TABLE "TEST_table"(id int);
SELECT * FROM "TEST_table" WHERE "ID" = 10;Catatan Penggunaan
Anda dapat mengatur parameter
polar_case_sensitive_for_columnrefke salah satu nilai berikut di konsol untuk mengaktifkan atau menonaktifkan fitur ketidakpekaan terhadap huruf besar/kecil:on: Fitur ketidakpekaan terhadap huruf besar/kecil diaktifkan.
off: Fitur ketidakpekaan terhadap huruf besar/kecil dinonaktifkan.
CatatanSecara default, fitur ketidakpekaan terhadap huruf besar/kecil diaktifkan untuk kluster yang dibuat setelah versi minor 1.1.24 dirilis pada Juli 2022.
Untuk kluster yang dibuat sebelum versi minor 1.1.24 dirilis pada Juli 2022, jika Anda tidak dapat memastikan apakah basis data, skema, tabel, atau kolom dalam kluster tersebut menggunakan nama dengan huruf yang sama tetapi berbeda kapitalisasi, jangan aktifkan fitur ketidakpekaan terhadap huruf besar/kecil. Jika tidak, hasil kueri yang salah dapat dikembalikan.
Kami merekomendasikan agar Anda tidak menentukan nama objek dengan huruf yang sama tetapi berbeda kapitalisasi.
Jika kueri melibatkan tabel dengan kolom yang memiliki nama dengan huruf yang sama tetapi berbeda kapitalisasi, kami merekomendasikan agar Anda menamai kolom dalam format
<Nama Tabel.Nama Kolom>atau menggunakanaliasdari kolom tersebut.Setelah Anda mengaktifkan fitur ini untuk kluster yang sudah ada tempat tabel telah dibuat, kami merekomendasikan agar Anda berhati-hati saat mengeksekusi pernyataan DDL pada kluster tersebut. Sebagai contoh, anggaplah Anda mengaktifkan fitur ketidakpekaan terhadap huruf besar/kecil untuk kluster tempat tabel bernama
"tbl"sudah ada. Kemudian, Anda mengeksekusi pernyataan CREATE TABLE berikut untuk membuat tabel bernama"TBL". Saat Anda mengeksekusi pernyataan DROP TABLE untuk menghapus tabel "TBL", kedua tabel akan dihapus karena tabel bernama "tbl" dan "TBL" dianggap setara.CREATE TABLE "tbl" (id int); DROP TABLE "TBL";
Deskripsi Fitur
Fitur ketidakpekaan terhadap huruf besar/kecil hanya berlaku untuk nama objek berikut:
Basis Data
Skema
Tabel, termasuk objek relasional seperti ekspresi tabel umum (CTE), indeks, tampilan, dan tampilan material
Kolom
Alias
Fungsi
Sinonim
Objek lain, seperti paket, tidak didukung oleh fitur ketidakpekaan terhadap huruf besar/kecil.
Fungsi didukung oleh fitur ketidakpekaan terhadap huruf besar/kecil untuk kluster yang revisi versinya 1.1.42 atau lebih baru.
Anda tidak dapat mengaktifkan fitur ketidakpekaan terhadap huruf besar/kecil untuk objek-objek di atas secara terpisah.
Anda dapat mengatur parameter polar_case_sensitive_for_columnref ke salah satu nilai berikut dengan mengeksekusi pernyataan SQL untuk mengaktifkan atau menonaktifkan fitur ketidakpekaan terhadap huruf besar/kecil:
on: Fitur ketidakpekaan terhadap huruf besar/kecil diaktifkan.
off: Fitur ketidakpekaan terhadap huruf besar/kecil dinonaktifkan.
Secara default, fitur ketidakpekaan terhadap huruf besar/kecil diaktifkan untuk kluster yang dibuat setelah versi minor 1.1.24 dirilis pada Juli 2022.
Contoh
Untuk tabel, kolom, dan alias:
CREATE TABLE "TEST_TABLE"(id int); INSERT INTO test_table VALUES(10); SELECT "T".id FROM "TEST_TABLE" AS t WHERE "ID" = 10;Hasil sampel:
id ---- 10 (1 row)Untuk basis data, skema, dan fungsi:
CREATE DATABASE test_database; \c test_database CREATE SCHEMA "TEST_SCHEMA"; CREATE FUNCTION "TEST_SCHEMA"."TEST_FUNCTION"(IN i int) RETURNS int AS $$ BEGIN RETURN i; END; $$ LANGUAGE plpgsql; SELECT "TEST_DATABASE".test_schema.test_function(10) FROM dual;Hasil sampel:
test_function --------------- 10 (1 row)Untuk paket:
CREATE PACKAGE "TEST_PACKAGE" AS FUNCTION test_function(i int) RETURN int; END; CREATE PACKAGE BODY "TEST_PACKAGE" AS FUNCTION test_function(i int) RETURN int IS BEGIN RETURN i; END; END; SELECT test_package."TEST_FUNCTION"(100) FROM dual;Hasil sampel:
TEST_FUNCTION --------------- 100 (1 row)