On this page
10.4. 储值
根据以下步骤,将要插入表中的值转换为目标列的数据类型。
值存储类型转换
检查与目标的精确匹配。
否则,请尝试将表达式转换为目标类型。如果在
pg_cast
目录中注册了两种类型之间的* assignment cast *,则有可能(请参见CREATE CAST)。或者,如果表达式是未知类型的 Literals,则 Literals 字符串的内容将被馈送到目标类型的 Importing 转换例程。检查是否针对目标类型进行了大小调整。大小调整类型转换是从该类型到其自身的转换。如果在
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)
true 发生的是,默认情况下,两个未知 Literals 被解析为text
,从而将||
运算符解析为text
并置。然后,运算符的text
结果转换为bpchar
(“ _blank-chard”,character
数据类型的内部名称)以匹配目标列类型。 (由于从text
到bpchar
的转换是二进制强制的,因此此转换不会插入任何实函数调用.)最后,在系统目录中找到了调整大小的函数bpchar(bpchar, integer, boolean)
并将其应用于运算符的结果和存储的列长。此特定于类型的功能执行所需的长度检查并添加填充空间。