为什么 atttypmod 不同于 character_maximum_length?
Why does atttypmod differ from character_maximum_length?
我正在将一些 information_schema 查询转换为系统目录查询,但我得到了不同的字符最大长度结果。
SELECT column_name,
data_type ,
character_maximum_length AS "maxlen"
FROM information_schema.columns
WHERE table_name = 'x'
return是我期望的结果,例如:
city character varying 255
company character varying 1000
等效目录查询
SELECT attname,
atttypid::regtype AS datatype,
NULLIF(atttypmod, -1) AS maxlen
FROM pg_attribute
WHERE CAST(attrelid::regclass AS varchar) = 'x'
AND attnum > 0
AND NOT attisdropped
似乎return每长度+4:
city character varying 259
company character varying 1004
为什么不同?总是简单地从结果中减去 4 是否安全?
您可以说从类型 char
和 varchar
的结果中减去 4 是安全的。 information_schema.columns
视图在幕后所做的是调用一个函数 informatoin_schema._pg_char_max_length
(这是你的区别,因为你没有),它的主体是:
CREATE OR REPLACE FUNCTION information_schema._pg_char_max_length(typid oid, typmod integer)
RETURNS integer
LANGUAGE sql
IMMUTABLE PARALLEL SAFE STRICT
AS $function$SELECT
CASE WHEN = -1 /* default typmod */
THEN null
WHEN IN (1042, 1043) /* char, varchar */
THEN - 4
WHEN IN (1560, 1562) /* bit, varbit */
THEN
ELSE null
END$function$
也就是说,对于 chars 和 varchars,它总是减去 4。
这使得您的查询不等同于它实际需要连接到 pg_type
以建立列的 typid
并将值包装在函数中以使其具有 return 的程度适当的值。这是因为事实上,有更多的事情在起作用。如果你想简化,你可以在没有连接的情况下进行(虽然它不会是防弹的):
SELECT attname,
atttypid::regtype AS datatype,
NULLIF(information_schema._pg_char_max_length(atttypid, atttypmod), -1) AS maxlen
FROM pg_attribute
WHERE CAST(attrelid::regclass AS varchar) = 'x'
AND attnum > 0
AND NOT attisdropped
这应该可以为您完成。如果您想进一步调查此事,请参阅 information_schema.columns
.
的视图定义
我正在将一些 information_schema 查询转换为系统目录查询,但我得到了不同的字符最大长度结果。
SELECT column_name,
data_type ,
character_maximum_length AS "maxlen"
FROM information_schema.columns
WHERE table_name = 'x'
return是我期望的结果,例如:
city character varying 255
company character varying 1000
等效目录查询
SELECT attname,
atttypid::regtype AS datatype,
NULLIF(atttypmod, -1) AS maxlen
FROM pg_attribute
WHERE CAST(attrelid::regclass AS varchar) = 'x'
AND attnum > 0
AND NOT attisdropped
似乎return每长度+4:
city character varying 259
company character varying 1004
为什么不同?总是简单地从结果中减去 4 是否安全?
您可以说从类型 char
和 varchar
的结果中减去 4 是安全的。 information_schema.columns
视图在幕后所做的是调用一个函数 informatoin_schema._pg_char_max_length
(这是你的区别,因为你没有),它的主体是:
CREATE OR REPLACE FUNCTION information_schema._pg_char_max_length(typid oid, typmod integer)
RETURNS integer
LANGUAGE sql
IMMUTABLE PARALLEL SAFE STRICT
AS $function$SELECT
CASE WHEN = -1 /* default typmod */
THEN null
WHEN IN (1042, 1043) /* char, varchar */
THEN - 4
WHEN IN (1560, 1562) /* bit, varbit */
THEN
ELSE null
END$function$
也就是说,对于 chars 和 varchars,它总是减去 4。
这使得您的查询不等同于它实际需要连接到 pg_type
以建立列的 typid
并将值包装在函数中以使其具有 return 的程度适当的值。这是因为事实上,有更多的事情在起作用。如果你想简化,你可以在没有连接的情况下进行(虽然它不会是防弹的):
SELECT attname,
atttypid::regtype AS datatype,
NULLIF(information_schema._pg_char_max_length(atttypid, atttypmod), -1) AS maxlen
FROM pg_attribute
WHERE CAST(attrelid::regclass AS varchar) = 'x'
AND attnum > 0
AND NOT attisdropped
这应该可以为您完成。如果您想进一步调查此事,请参阅 information_schema.columns
.