向数据表中写入新数据时(如执行 INSERT 或 UPDATE),待写入的表达式值将按照以下步骤转换为目标列的物理数据类型:
值存储类型转换流程
检查表达式类型是否与目标列类型完全精确一致。若完全相同,直接写入。
尝试通过赋值转换(assignment cast)将表达式转换为目标类型。只要两类型之间在系统目录 pg_cast 中注册了赋值转换路径即可生效(参见 CREATE CAST)。对于未指定类型的字面量,其字符串内容直接交由目标类型的输入转换函数进行解析。
检查目标类型是否存在长度尺寸修饰转换(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)