PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

10.4. 值存储 #

向数据表中写入新数据时(如执行 INSERT 或 UPDATE),待写入的表达式值将按照以下步骤转换为目标列的物理数据类型:

值存储类型转换流程

  1. 检查表达式类型是否与目标列类型完全精确一致。若完全相同,直接写入。

  2. 尝试通过赋值转换(assignment cast)将表达式转换为目标类型。只要两类型之间在系统目录 pg_cast 中注册了赋值转换路径即可生效(参见 CREATE CAST)。对于未指定类型的字面量,其字符串内容直接交由目标类型的输入转换函数进行解析。

  3. 检查目标类型是否存在长度尺寸修饰转换(sizing cast,即该类型转换至自身的转换函数)。若存在,系统会在将数据存入目标列之前自动调用该函数。该函数负责施加任何依赖于长度上限的截断或定长空格补齐语义(例如针对 varchar(n) 或 char(n) 执行长度校验)。

Example 10.3. character 定长类型存储转换

对于声明为 character(20) 的目标列,以下语句展示了存储值会被自动补齐到预设长度:

CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, octet_length(v) FROM vv;

          v           | octet_length
----------------------+--------------
 abcdef               |           20
(1 row)