You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中information_schema表俄文排序规则及列名长度问题

问题分析与解决方案

1. information_schema.COLUMNS 中lower()无法转换俄文大小写的原因

information_schema属于PostgreSQL的系统视图集合,其元数据(包括COLUMN_NAME字段)的排序规则继承自创建数据库时使用的模板库(你这里指定的是template0)。由于template0默认采用系统级的非俄文排序规则(通常是C规则),而非你设置的ru_RU.utf8,导致直接调用lower(COLUMN_NAME)时,函数使用字段自带的规则,无法正确处理俄文字母的大小写转换。只有显式指定COLLATE "ru_RU.utf8",才会强制使用当前数据库的俄文规则,得到正确结果。

2. 列名长度仅33字符的原因

information_schema.columns.column_name字段定义为character varying(63),这个长度是按字节计算的。俄文字符在UTF-8编码下每个占2-3字节,因此实际能存储的俄文字符数远少于63个,导致较长的俄文列名被截断为33字符左右。而PostgreSQL默认的列名字节限制是63,这是因为存储实际列名的系统表pg_attribute.attname采用name类型,严格遵循63字节限制,但information_schema视图的字段类型限制加上编码特性,才出现了字符数不足的现象。


解决办法

俄文大小写转换问题

  • 方案一:显式指定排序规则(已验证有效):
SELECT lower(COLUMN_NAME COLLATE "ru_RU.utf8") FROM INFORMATION_SCHEMA.COLUMNS;
  • 方案二:直接查询系统表:绕过information_schema,直接查询存储元数据的pg_attribute表,该表字段的排序规则继承当前数据库的ru_RU.utf8,无需额外指定:
SELECT lower(attname) AS column_name_lower
FROM pg_attribute
JOIN pg_class ON pg_attribute.attrelid = pg_class.oid
JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
WHERE pg_namespace.nspname = 'public' -- 替换为你的目标 schema
AND pg_class.relname = 'your_table' -- 替换为你的目标表名
AND pg_attribute.attnum > 0; -- 排除系统隐含字段

列名截断问题

直接查询pg_attribute表获取完整列名,该表的attname字段严格遵循63字节限制,能完整存储所有合法列名:

SELECT attname AS full_column_name
FROM pg_attribute
JOIN pg_class ON pg_attribute.attrelid = pg_class.oid
WHERE pg_class.relname = 'your_table'
AND pg_attribute.attnum > 0;

内容的提问来源于stack exchange,提问作者AlexTank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:50:18