历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.
5.5. 查询目标 #
要插入表的值按下列步骤强制转换为目标列的数据类型。
查询目标类型解析
检查是否与目标类型精确匹配。
否则,尝试把表达式强制转换成目标类型。如果两个类型已知二进制兼容,或者存在转换函数,转换就会成功。如果表达式是未知类型的字面量,就把字面字符串的内容送给目标类型的输入转换例程。
如果目标是定长类型(例如声明了长度的
char或varchar),则尝试为目标类型寻找一个尺寸调整函数。尺寸调整函数是一个与类型同名的函数,接受两个参数,第一个是该类型,第二个是 integer,并返回同一类型。如果找到了这样的函数,就应用它,把列的声明长度作为第二个参数传递。
例 5.6. character 的存储类型转换
对于声明为 character(20) 的目标列,下面的查询确保目标的大小被正确调整:
tgl=> CREATE TABLE vv (v character(20));
CREATE
tgl=> INSERT INTO vv SELECT 'abc' || 'def';
INSERT 392905 1
tgl=> SELECT v, length(v) FROM vv;
v | length
----------------------+--------
abcdef | 20
(1 row)
这里实际发生的是:两个未知字面量默认被解析为
text,使 || 操作符被解析为 text 连接。然后操作符的 text
结果被强制转换为 bpchar(“blank-padded
char”,字符数据类型的内部名)以匹配目标列类型。(由于解析器知道 text 和
bpchar 二进制兼容,这个转换是隐式的,不会插入任何真实的函数调用。)最后,在系统目录中找到尺寸调整函数
bpchar(bpchar, integer),应用到操作符的结果和存储的列长度上。这个类型特定的函数执行所需的长度检查并添加填充空格。