2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

10.4. 值存储 #

要插入到表中的值将根据以下步骤转换为目标列的数据类型。

值存储类型转换

  1. 检查与目标是否完全匹配。

  2. 否则,尝试将表达式转换为目标类型。如果在 pg_cast 目录中注册了两种类型之间的 赋值转换,则这是可能的(参见 CREATE CAST)。或者,如果表达式是未知类型文字,则文字字符串的内容将被馈送到目标类型的输入转换例程。

  3. 检查目标类型是否存在大小转换。大小转换是从该类型到自身的转换。如果在 pg_cast 目录中找到一个,则在将其存储到目标列之前将其应用于表达式。这种转换的实现函数始终接受一个 integer 类型的额外参数,该参数接收目标列的 atttypmod 值(通常是其声明的长度,尽管 atttypmod 的解释因数据类型而异),并且它可能接受第三个 boolean 参数,该参数表示转换是显式还是隐式。转换函数负责应用任何长度相关的语义,例如大小检查或截断。

示例 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)

这里实际上发生的是,两个未知文字默认解析为 text,允许 || 运算符解析为 text 连接。然后,运算符的 text 结果将转换为 bpchar(“空白填充字符”,character 数据类型的内部名称),以匹配目标列类型。(由于从 textbpchar 的转换是二进制强制的,因此此转换不会插入任何实际的函数调用。)最后,大小函数 bpchar(bpchar, integer, boolean) 在系统目录中找到并应用于运算符的结果和存储的列长度。此特定于类型的函数执行所需的长度检查和填充空格的添加。


提交更正

如果您在文档中看到任何不正确的内容,不符合您对特定功能的体验,或者需要进一步澄清,请使用 此表格 报告文档问题。