Postgresql 如何获取可变长度列的最大长度(以字节为单位)?

Postgresql 如何获取可变长度列的最大长度(以字节为单位)?,postgresql,Postgresql,我想获取可变长度列的最大长度(以字节为单位)。我的其中一列具有以下定义: shortname字符变化(35)不为空 userid整数不为空 columncount smallint不为NULL 我试图从pg_属性表中检索一些信息,但是attlen列对于所有可变长度列都具有-1值。我还尝试使用pg\u column\u size函数,但它不接受列的名称作为输入参数 这可以在SQL Server中轻松完成 是否有其他方法获取我要查找的值?您需要使用大小写表达式检查pg\u属性.attle

我想获取可变长度列的最大长度(以字节为单位)。我的其中一列具有以下定义:

  • shortname字符变化(35)不为空
  • userid整数不为空
  • columncount smallint不为NULL
我试图从
pg_属性
表中检索一些信息,但是
attlen
列对于所有可变长度列都具有
-1
值。我还尝试使用
pg\u column\u size
函数,但它不接受列的名称作为输入参数

这可以在SQL Server中轻松完成


是否有其他方法获取我要查找的值?

您需要使用大小写表达式检查
pg\u属性.attlen
,然后根据该值计算以字节为单位的最大大小。要获取varchar列的最大大小,可以“窃取”用于
varchar
char
列的
information\u schema.columns.character\u octet\u length
中的表达式

大致如下:

select a.attname, 
       t.typname,
       case 
          when a.attlen <> -1 then attlen
          when t.typname in ('bytea', 'text') then pg_size_bytes('1GB')
          when t.typname in ('varchar', 'char') then information_schema._pg_char_octet_length(information_schema._pg_truetypid(a.*, t.*), information_schema._pg_truetypmod(a.*, t.*))
       end as max_bytes
from pg_attribute a
  join pg_type t on a.atttypid = t.oid
where a.attrelid = 'stuff.test'::regclass
  and a.attnum > 0
  and not a.attisdropped;
选择一个.attname,
t、 类型名称,
案例
当a.attlen为-1时,则为attlen
当t.typname输入('bytea','text')时,则pg_size_字节('1GB')
当t.typname在('varchar','char')中时,则信息\u schema.\u pg\u char\u octet\u length(信息\u schema.\u pg\u truetypid(a.*,t.*),信息\u schema.\u pg\u truetypmod(a.*,t.*))
以最大字节结束
从pg_属性a
连接a.ATTTYPED=t.oid上的pg_类型t
其中a.attrelid='stuff.test':regclass
和a.attnum>0
一点也不偷听;
请注意,这不会为
numeric
返回正确的大小,因为这也是一种可变长度类型。“实际存储需求是每组四位十进制数字需要两个字节,加上三到八个字节的开销”


作为旁注:这似乎是一件非常奇怪的事情。特别是提到存储过程中的临时表。在Postgres中,通常不需要使用临时表。不要盲目复制在SQL Server中可能运行良好的旧方法,您应该了解Postgres的工作原理,并更改方法以匹配Postgres中的最佳实践

我见过许多迁移失败或性能平平,因为假设“系统A”的最佳实践可以在不更改“系统B”的情况下应用。你也需要这样做


如果这检查临时表的列,那么为什么不简单地使用
pg\u column\u size()

@a\u horse\u with\u no\u name检查列值的实际大小?您是说
信息模式的
字符\u最大长度列
?不幸的是,此列不包含字节数,并且对于
时间戳
整数
等类型,它具有
null
。您无法看到以字节为单位的最大长度,因为它取决于列中存储的实际字符。在多字节编码中,单个字符最多可占用4个字节。因此,以字节为单位显示最大长度在
信息\u schema.columns
中没有意义。因此,以字节为单位的绝对最大长度是“字符数*正在使用的编码的单个字符的最大长度”。如果您使用UTF-8,您可以将字符数乘以4@a_horse_with_no_name是的,但是我们有类似SQL Server的东西吗?
sys.columns
max_length
列能够显示固定大小和可变长度列的最大长度。文档详细描述了每种类型的存储要求。为什么需要在查询的输出中重复文档?你为什么不能直接用RTFM呢?谢谢你的详细回答!我同意您的观点,逐行转换模式可能是一个错误的决定。我想我需要根据PostgreSQL的特定功能重新实现这个过程。