代码之家  ›  专栏  ›  技术社区  ›  Matt S

为什么atttypmod不同于字符的最大长度?

  •  3
  • Matt S  · 技术社区  · 6 年前

    SELECT column_name, 
        data_type , 
        character_maximum_length AS "maxlen"
    FROM information_schema.columns 
    WHERE table_name = 'x'
    

    返回我期望的结果,例如:

    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
    

    似乎每个长度返回+4:

    city    character varying   259
    company character varying   1004
    

    1 回复  |  直到 6 年前
        1
  •  7
  •   Kamil Gosciminski    6 年前

    你可以说从类型的结果中减去4是安全的 char varchar 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 $2 = -1 /* default typmod */
           THEN null
           WHEN $1 IN (1042, 1043) /* char, varchar */
           THEN $2 - 4
           WHEN $1 IN (1560, 1562) /* bit, varbit */
           THEN $2
           ELSE null
      END$function$
    

    pg_type typid

    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
    

    这应该能帮你。如果您想进一步调查此事,请参阅查看定义 信息\u schema.columns .