
# 隐式类型转换
隐式类型转换主要适用于函数调用、操作符和值存储场景。本章节主要介绍值存储场景的类型解析。其他场景请参见[函数和操作符](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/gaussdb-81-0143.html#ZH-CN_TOPIC_0000002527965458)章节。
#### 值存储数据类型解析
1. 查找与目标字段准确的匹配。
2. 尝试将表达式直接转换成目标类型。如果已知两种类型之间存在一个已注册的转换函数，那么直接调用该转换函数。如果表达式是一个未知类型文本，该文本字符串的内容将传递给目标类型的输入转换过程。
3. 检查目标类型是否有长度转换。长度转换是一个类型自身的转换。如果目标类型存在长度转换逻辑，那么在存储到目标字段之前先在表达式上转换。转换函数接收一个INTEGER类型的参数，接收目标字段的atttypmod值（实际为函数指定的长度，atttypmod的含义根据不同的数据类型而存在差异），并且这个函数可能会接收一个布尔类型的数据作为第三个参数，用于表示转换方式（显式转换或隐式转换）。转换函数主要用于设置长度相关的语句，比如长度检查或者截断。
示例：
```
m_db=# CREATE TABLE char_storage (
    VS_COL1 CHAR(20)
);
m_db=# INSERT INTO char_storage VALUES('abcdef');
m_db=# SELECT VS_COL1, length(VS_COL1) FROM char_storage;
 VS_COL1 | length 
---------+--------
 abcdef  |      6
(1 row)
m_db=# DROP TABLE char_storage;
```
FLOAT存储类型向BINARY存储类型转换，向目标列为BINARY(5)的表插入从FLOAT列取出的值：
```
m_db=# CREATE TABLE varchar_storage (
    VS_COL1 BINARY(5)
) DISTRIBUTE BY REPLICATION;
m_db=# CREATE TABLE float_storage (
    VS_COL1 FLOAT
) DISTRIBUTE BY REPLICATION;
m_db=# INSERT INTO float_storage VALUES(1234567);
m_db=# INSERT INTO varchar_storage SELECT * FROM float_storage;
m_db=# DROP TABLE varchar_storage, float_storage;
```
