
# 值存储
#### 值存储数据类型解析
1. 查找与目标字段准确的匹配。
2. 试着将表达式直接转换成目标类型。如果已知这两种类型之间存在一个已登记的转换函数，那么直接调用该转换函数即可。如果表达式是一个未知类型文本，该文本字符串的内容将交给目标类型的输入转换过程。
3. 检查目标类型是否有长度转换。长度转换是一个从某类型到自身的转换。如果在pg_cast表里面找到一个，那么在存储到目标字段之前先在表达式上应用。这样的转换函数总是接受一个额外的类型为integer的参数，它接收目标字段的atttypmod值（实际上是其声明长度，atttypmod的解释随不同的数据类型而不同），并且它可能接受一个boolean类型的第三个参数，表示转换是显式的还是隐式的。转换函数负责施加那些长度相关的语义，比如长度检查或者截断。
 
#### 示例
character存储类型转换。
本示例演示向character(20) 类型列插入数据时的处理逻辑。尽管插入的字符串长度小于定义长度，但查询结果显示存储长度为20字节，说明系统自动进行了空白填充。
```
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)
```
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
character存储类型转换流程如下：
1. 两个unknown文本系统默认将其解析成text，这样就允许\|\|操作符解析成text连接。
2. 操作符的text结果转换成bpchar（"空白填充的字符型"， character类型内部名称）以匹配目标字段类型。从text到bpchar的转换是二进制兼容的，此转换过程是隐含的，且实际上不调用任何函数。
3. 在系统表里找到长度转换函数bpchar(bpchar, integer, boolean)并应用于该操作符的结果和存储的字段长度。该函数执行必要的长度检查，并在数据尾部填充空白以满足定长要求。
 
