10.4. 值存储

按照下面的步骤将插入到一个表中的值被转换为目的列的数据类型。

值存储类型转换

  1. 检查一个与目标的准确匹配。

  2. 另外,试着转换表达式为目标类型格式。 如果在两种类型之间有一个累加寄存器将会成功。 如果所表达的是一个未知类型的文字,那么该文字字符内容为目标格式将提供给的输入转换程序。

  3. 检查是否有一个对于目标类型大小计算标准。大小计算是一个从类型到自身的计算。 如果在系统表pg_cast中发现一个,那么在存储到目标列之前 将它应用到表达式。 对于这样的一个计算的执行函数总用一个额外的参数类型integer,接收 目标列的声明长度(实际上,是它的atttypmod值;对于不同数据类型atttypmod转变的解释)。 该计算函数负责应用任何从属长度语义,例如大小检查或截断。

Example 10-6. character存储类型转换

对于一个声明的目标列如character(20),下面的语句确保存储正确的值:

CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, length(v) FROM vv;

          v           | length
----------------------+--------
 abcdef               |     20
(1 row)

实际发生的事情是两个未知文字默认为text类型,||操作符解析为text串联。 text是操作符转换成bpchar"blank-paddedchar"character数据类型的内置名称)去匹配目标列类型。 (由于从textbpchar的转换是强制二进制,该转换不会插入任何真正的函数调用。) 最后,在系统表中找到的大小函数bpchar(bpchar, integer)被应用到操作符结果中和存储列长度。 特定格式函数执行必要的长度检查和添加空格。