历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
10.4. 值存储 #
要插入表中的值会按照以下步骤转换为目标列的数据类型。
值存储的类型转换
检查是否与目标类型精确匹配。
否则,尝试把表达式转换为目标类型。如果这两种类型之间存在已登记的类型转换,这就会成功。如果表达式是unknown类型字面量,则会把字符串字面量的内容送入目标类型的输入转换例程。
如果目标是定长类型(例如声明了长度的
char或varchar),则尝试为目标类型寻找一个尺寸调整函数。尺寸调整函数是一个与类型同名的函数,接受两个参数,第一个是该类型,第二个是integer类型,并返回同一类型。如果找到了这样的函数,就应用它,把列的声明长度作为第二个参数传递。
例 10.6. 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)这里实际发生的是,两个unknown类型字面量默认都被解析为text,从而使||操作符被解析为text的连接操作。然后,操作符得到的text结果被转换为bpchar(“用空格填充的字符”,blank-padded char,即character数据类型的内部名称),以匹配目标列类型。(由于text和bpchar二进制兼容,这一转换不会插入任何真实的函数调用。)最后,系统从系统目录中找到尺寸调整函数bpchar(bpchar, integer),并把它应用到操作符结果以及存储列长度上。这个特定于类型的函数会执行所需的长度检查并补齐填充空格。