登录
10.4. 值存储#
要插入表中的值将根据以下步骤转换为目标列的数据类型。
值存储类型转换
检查与目标是否完全匹配。
否则,尝试将表达式转换为目标类型。如果在
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)
并将其应用于运算符的结果和存储的列长度。此类型特定函数执行所需的长度检查并添加填充空格。