受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

10.4. 值存储 #

要插入表中的值会按照以下步骤转换为目标列的数据类型。

值存储的类型转换

  1. 检查是否与目标类型精确匹配。

  2. 否则,尝试把表达式转换为目标类型。如果这两种类型之间在pg_cast目录中登记了赋值类型转换(见CREATE CAST),就可以这样做。另一种情况是,如果表达式是unknown类型文字,则会把文字字符串的内容送入目标类型的输入转换例程。

  3. 检查目标类型是否有尺寸调整类型转换。尺寸调整类型转换是该类型到其自身的类型转换。如果在pg_cast目录中找到了这种转换,就在把表达式存入目标列之前先应用它。此类类型转换的实现函数总是额外接受一个integer参数,用来接收目标列的atttypmod值(通常是其声明长度,尽管不同数据类型对atttypmod的解释各不相同);它还可能接受第三个boolean参数,用来说明该类型转换是显式还是隐式的。类型转换函数负责应用所有与长度相关的语义,例如长度检查或截断。

Example 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)

这里实际发生的是,两个unknown类型文字默认都被解析为text,从而使||操作符被解析为text的连接操作。然后,操作符得到的text结果被转换为bpcharblank-padded char,即character数据类型的内部名称),以匹配目标列类型。(由于从textbpchar的转换是二进制可强制的,这一步不会插入任何真实的函数调用。)最后,系统目录中找到尺寸调整函数bpchar(bpchar, integer, boolean),并把它应用到操作符结果以及存储列长度上。这个特定于类型的函数会执行所需的长度检查并补齐填充空格。


提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。