本文介绍了 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类对象)。
  • 列名。
  • 别名。
说明 函数和包等其他数据库对象暂时不支持大小写不敏感模式。