全部產品
Search
文件中心

PolarDB:大小寫不敏感

更新時間:Jul 06, 2024

本文介紹了PolarDB PostgreSQL版(相容Oracle)的大小寫不敏感功能。

簡介

當前由於Oracle和PolarDB PostgreSQL版(相容Oracle)對於資料庫物件名稱的大小寫處理方式不同,在不加雙引號的情況下,Oracle將對象名轉為大寫儲存,PolarDB PostgreSQL版(相容Oracle)將對象名轉為小寫儲存,使用雙引號時則不做轉換,因此部分Oracle使用者使用PolarDB PostgreSQL版(相容Oracle)時可能出現大小寫行為不一致的問題,例如:
  • create table tbl(id int);
    
    select * from "TBL" where "ID" = 10;
    上述SQL語句在Oracle中執行時tbl表名在系統檢視表中預設大寫儲存,因此查詢語句可以正常執行,而PolarDB PostgreSQL版(相容Oracle)由於預設小寫儲存,查詢語句執行時則會報錯不存在表“TBL”表。
  • create table "TBL"("ID" int);
    
    select * from TBL where ID = 10;
    上述SQL語句在PolarDB PostgreSQL版(相容Oracle)中執行也會出現無法匹配表名的問題。
因此,PolarDB PostgreSQL版(相容Oracle)推出大小寫不敏感功能,解決從Oracle遷移到PolarDB PostgreSQL版(相容Oracle)頻繁出現的大小寫問題。開啟大小寫不敏感功能後,對於無雙引號、雙引號+全大寫或雙引號+全小寫資料庫物件被視為等價。例如,以下五種建立表的語句是等價的:
create table "TBL"("ID" int);

create table TBL(ID int);

create table tbl(id int);

create table "tbl"("id" int);

create table Tbl (Id int);
說明 雙引號+大小寫交錯的對象名不受影響。例如:
create table "Tbl" ("Id" int);

select * from "Tbl" where "Id" = 1;

注意事項

  • 可以通過控制台設定polar_case_sensitive_for_columnref參數來開啟或關閉大小寫不敏感功能,取值如下:
    • on:開啟大小寫不敏感功能。
    • off:關閉大小寫不敏感功能。
    說明 核心小版本(V1.1.24)(發布時間:2022年7月)之後建立的叢集,預設開啟大小寫不敏感功能。
  • 核心小版本(V1.1.24)(發布時間:2022年7月)之前建立的叢集,當無法確保資料庫中不存在同名不同大小寫資料庫物件(database、schema、table、column)時,請勿手動開啟大小寫不敏感功能,否則可能導致查詢不正確。
  • 為每個對象賦予合理且有區分度的名稱,盡量避免出現同名不同大小寫情況。
  • 當查詢涉及的多張表中有列出現同名不同大小寫時,盡量以<表名.列名>別名的方式引用,避免查詢解析時出現列引用混淆。
  • 執行DDL操作時需要注意操作的對象名。例如,對於大小寫不敏感且在資料庫相同模式下不可能同時存在"tbl"表和"TBL"表,因此如下語句可以成功執行。
    create table "tbl" (id int);
    
    drop table "TBL";

使用限制

建立和使用以下資料庫物件時,無雙引號、雙引號+全大寫和雙引號+全小寫名稱具有相同的結果,雙引號+大小寫交錯名不受影響。

  • 資料庫名。
  • 模式名。
  • 表名(包括cte、索引、視圖、物化視圖等relation類對象)。
  • 列名。
  • 別名。
說明 函數和包等其他資料庫物件暫時不支援大小寫不敏感模式。