PostgreSQL模式名加双引号引发42P01错误,咨询相关配置
PostgreSQL双引号包裹模式名+表名触发42P01错误的原因
PostgreSQL不存在专门控制双引号包裹模式名+表名写法的服务器/数据库配置项,你的问题大概率由以下两种情况导致:
1. 标识符大小写不匹配
PostgreSQL对标识符的大小写规则如下:
- 未加双引号的标识符会被自动转换为小写(Linux环境下默认
lower_case_table_names=0,保留创建时的大小写,但查询时无引号会转小写匹配)。 - 加双引号的标识符会严格精确匹配创建时的大小写。
比如:
- 若你的模式是用
CREATE SCHEMA ads;(小写)创建的,ads."MyTableName"会正常执行:ads被转成小写匹配实际模式,"MyTableName"精确匹配表名。 - 但如果SQL中用
"Ads"或"ADS"包裹模式名,就会因大小写不匹配触发42P01错误;若实际模式名是大写的"ADS",用"ads"也会找不到对应模式。
2. 使用了中文双引号
你的示例SQL中使用的是中文双引号“”,而非英文双引号""。PostgreSQL会将中文双引号视为标识符的一部分,因此“ads”.”MyTableName”实际是查找名为“ads”的模式和”MyTableName”的表,自然不存在对应的关系。
而ads.”MyTableName”能正常执行,是因为ads是无引号的正确标识符(被转小写匹配实际模式),若表名的引号实际为英文格式,就能精准匹配表名。
验证方法
- 查询系统表确认模式名的实际存储:
查看返回结果是否与你SQL中双引号包裹的模式名大小写完全一致。SELECT nspname FROM pg_namespace WHERE nspname ~* 'ads'; - 检查执行的SQL语句,确保所有引号都是英文双引号
""。
内容的提问来源于stack exchange,提问作者user150528
相关产品推荐
相关产品推荐

