插入表的值将根据以下步骤转换为目标列的数据类型。
值存储类型转换
检查与目标的精确匹配。
否则,尝试将表达式转换为目标类型。如果两个类型之间存在已在 pg_cast
目录中注册的赋值转换(请参阅 CREATE CAST),则这是可能的。或者,如果表达式是未知类型字面量,则字面量字符串的内容将被馈送到目标类型的输入转换例程。
检查目标类型是否存在大小转换。大小转换是指从该类型到自身的转换。如果在 pg_cast
目录中找到一个,则在存储到目标列之前将其应用于表达式。此类转换的实现函数始终接受一个额外的 integer
类型参数,该参数接收目标列的 atttypmod
值(通常是其声明的长度,尽管 atttypmod
的解释因数据类型而异),并且可能接受一个第三个 boolean
参数,该参数指示转换是显式的还是隐式的。转换函数负责应用任何依赖于长度的语义,例如大小检查或截断。
示例 10.9. 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)
这里实际发生的是,两个未知字面量默认解析为 text
,允许 ||
运算符解析为 text
连接。然后,运算符的 text
结果被转换为 bpchar
(“空格填充字符”,character
数据类型的内部名称),以匹配目标列类型。(由于从 text
到 bpchar
的转换是二进制可强制转换的,因此此转换不会插入任何实际的函数调用。)最后,在系统目录中找到大小转换函数 bpchar(bpchar, integer, boolean)
,并将其应用于运算符的结果和存储的列长度。此特定于类型的函数执行所需的大小检查和空格填充。
如果您在文档中看到任何不正确、与您使用该特定功能时的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。