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)

这里真正发生的事情是两个 unknown 文本解析缺省成text, 这样就允许 || 操作符解析成text连接。 然后操作符的text结果转换成bpchar"空白填充的字符型"character类型内部名称)以匹配目标字段类型。 (不过,因为知道textbpchar是二进制兼容的,这样的转换是隐含的并且实际上不做任何函数调用。) 最后,在系统表里找到测长函数 bpchar(bpchar,integer) 并且应用于该操作符的结果并存储字段长。这个类型相关的函数执行所需要的长度检查和额外的空白填充。