要插入到表中的值,会根据以下步骤转换为目标列的数据类型。
值存储类型转换
检查是否与目标类型完全匹配。
否则,尝试将表达式转换为目标类型。如果两种类型之间的赋值强制转换在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
(“空格填充的char”,即character
数据类型的内部名称),以匹配目标列类型。(由于从text
到bpchar
的转换是二进制可强制的,因此此转换不会插入任何实际的函数调用。)最后,在系统目录中找到大小调整函数bpchar(bpchar, integer, boolean)
,并将其应用于运算符的结果和存储的列长度。此特定于类型的函数执行所需的长度检查和填充空格的添加。
如果您发现文档中任何不正确的内容,或者与您使用特定功能的经验不符,或者需要进一步澄清的内容,请使用此表单报告文档问题。