PostgreSQL是否有设置可将标识符默认视为已加引号以保留大小写?
PostgreSQL 没有直接的配置项能让未加双引号的标识符默认保留大小写——这是它遵循SQL标准的默认行为:未加引号的表名、列名会被自动转换为小写存储和识别,只有带双引号的标识符才会严格区分大小写。你提到的quote_all_identifiers参数其实是控制PostgreSQL输出SQL(比如备份导出)时是否给所有标识符加引号,和输入SQL的处理逻辑无关,所以解决不了你的问题。
下面是几个务实的替代方案,避免全量修改SQL的工作量:
批量脚本替换SQL语句:用正则表达式配合IDE全局替换或脚本工具,批量给混合大小写的标识符加上双引号。比如匹配
[A-Z][a-zA-Z0-9]*这类符合你的命名规则的标识符,替换为"$0",注意要排除已经带引号的情况,避免重复添加。很多IDE(比如VS Code、IntelliJ)都支持带正则的全局替换,效率很高。改用ORM框架统一处理:如果你的项目还没使用ORM,建议迁移到SQLAlchemy这类跨数据库ORM。在模型定义里直接指定混合大小写的表名,ORM会自动根据数据库类型生成适配的SQL——比如给PostgreSQL的标识符加双引号,给SQL Server、SQLite保留原大小写,无需手动修改每条SQL语句。
数据库侧创建小写视图映射:在PostgreSQL中为每个混合大小写的表创建对应的小写视图,比如:
CREATE VIEW exampleoftablename AS SELECT * FROM "ExampleOfTableName";这样应用里直接使用小写表名就能访问对应的数据,不过这个方案的局限在于表结构变更时需要同步更新视图,且增删改操作可能需要额外处理触发器或规则。
内容的提问来源于stack exchange,提问作者Tomaso Tosolini

