插入表格的值根据以下步骤转换为目标列的数据类型。
值存储类型转换
查询与目标的确切匹配。
否则,尝试将表达式转换为目标类型。如果在 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
(“blank-padded char”,character
数据类型的内部名称)以匹配目标列类型。(由于从 text
到 bpchar
的转换是二进制可强制转换的,此转换不会插入任何真实函数调用。)最后,系统目录中找到了类型特定的函数 bpchar(bpchar, integer, boolean)
,并将其应用于运算符的结果和存储的列长度。此类型特定函数执行必需的长度检查和补空格的添加。