更新时间:2026-05-18 GMT+08:00
值存储
值存储数据类型解析
- 查找与目标字段准确的匹配。
- 试着将表达式直接转换成目标类型。如果已知这两种类型之间存在一个已登记的转换函数,那么直接调用该转换函数即可。如果表达式是一个未知类型文本,该文本字符串的内容将交给目标类型的输入转换过程。
- 检查目标类型是否有长度转换。长度转换是一个从某类型到自身的转换。如果在pg_cast表里面找到一个,那么在存储到目标字段之前先在表达式上应用。这样的转换函数总是接受一个额外的类型为integer的参数,它接收目标字段的atttypmod值(实际上是其声明长度,atttypmod的解释随不同的数据类型而不同),并且它可能接受一个boolean类型的第三个参数,表示转换是显式的还是隐式的。转换函数负责施加那些长度相关的语义,比如长度检查或者截断。
示例
character存储类型转换。
本示例演示向character(20) 类型列插入数据时的处理逻辑。尽管插入的字符串长度小于定义长度,但查询结果显示存储长度为20字节,说明系统自动进行了空白填充。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | CREATE TABLE x1 ( customer_sk integer, customer_id char(20), first_name char(6), last_name char(8) ) with (orientation = column,compression=middle) distribute by hash (last_name); INSERT INTO x1(customer_sk, customer_id, first_name) VALUES (3769, 'abcdef', 'Grace'); SELECT customer_id, octet_length(customer_id) FROM x1; customer_id | octet_length ----------------------+-------------- abcdef | 20 (1 row) |
character存储类型转换流程如下:
- 两个unknown文本系统默认将其解析成text,这样就允许||操作符解析成text连接。
- 操作符的text结果转换成bpchar("空白填充的字符型", character类型内部名称)以匹配目标字段类型。从text到bpchar的转换是二进制兼容的,此转换过程是隐含的,且实际上不调用任何函数。
- 在系统表里找到长度转换函数bpchar(bpchar, integer, boolean)并应用于该操作符的结果和存储的字段长度。该函数执行必要的长度检查,并在数据尾部填充空白以满足定长要求。