PostgreSQL创建表时如何保留大小写?能否通过引擎参数设置?
PostgreSQL全大写对象名自动转小写的问题解决
可以通过配置参数解决,但需注意参数生效条件,也有更灵活的替代方案:
问题原因
PostgreSQL默认会将未加双引号的标识符(表名、列名、约束名等)转换为小写存储,这是其对SQL标准大小写不敏感规则的实现方式,和你习惯的全大写编写方式冲突,导致带schema前缀的查询出现匹配问题。
解决方法
1. 双引号包裹标识符(推荐,无需修改参数)
在创建对象和查询时,用双引号包裹全大写的对象名,PostgreSQL会严格保留原始大小写:
创建表语句:
CREATE TABLE "T_CUSTOMERS" ( "CUS_ID" SERIAL NOT NULL, "CUS_LASTNAME" VARCHAR(36) NOT NULL, "CUS_FIRSTNAME" VARCHAR(36) NOT NULL, "CUS_REG_DATE" DATE NOT NULL, CONSTRAINT "PK_CUS_ID" PRIMARY KEY ("CUS_ID") );
查询时同样需要用双引号:
SELECT * FROM public."T_CUSTOMERS";
这种方法无需修改数据库配置,适合已运行的数据库,也能完全保留你全大写的编码习惯。
2. 初始化集群时设置lower_case_table_names参数
如果是新建的PostgreSQL集群,可以在初始化(执行initdb)时指定参数,强制所有对象名转为小写存储,同时查询时自动匹配大小写:
initdb --lower-case-table-names=1 -D /your/data/directory
参数取值说明:
1:所有对象名(包括加引号的)都会转为小写存储,查询时不区分大小写,你写全大写的SQL语句会自动匹配小写的对象。- 注意:该参数只能在初始化集群时设置,创建集群后无法修改,会影响整个集群的所有数据库。
内容的提问来源于stack exchange,提问作者Corpus
相关产品推荐
相关产品推荐

