更新时间:2025-10-23 GMT+08:00

隐式类型转换

隐式类型转换主要适用于函数调用、操作符和值存储场景。下面主要介绍值存储场景的类型解析。其他场景请见函数和操作符章节。

值存储数据类型解析

  1. 查找与目标字段准确的匹配。
  2. 尝试将表达式直接转换成目标类型。如果已知这两种类型之间存在一个已注册的转换函数,那么直接调用该转换函数即可。如果表达式是一个未知类型文本,该文本字符串的内容将交给目标类型的输入转换过程。
  3. 检查目标类型是否有长度转换。长度转换是一个从某类型到自身的转换。如果目标类型存在长度转换逻辑,那么在存储到目标字段之前先在表达式上应用。这样的转换函数总是接受一个额外的类型为integer的参数,它接收目标字段的atttypmod值(实际上是其声明长度,atttypmod的解释随不同的数据类型而不同),并且它可能会接受一个BOOL类型的第三个参数,表示转换是显式的还是隐式的。转换函数负责赋予那些长度相关的语义,比如长度检查或者截断。

示例:

CHAR存储类型转换。对一个目标列定义为CHAR(20)的语句,下面的语句显示存储值的长度正确:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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;

这里输入的字段被解析为UNKNOWN,UNKNOWN类型会根据目标列在系统表中找到对应CHAR类型的输入函数。最后,在系统表里找到长度转换函数bpchar(bpchar, integer, bool) 并且应用于结果和存储的字段长。这个类型相关的函数执行所需的长度检查和额外的空白填充。

FLOAT存储类型向BINARY存储类型转换, 对目标列为BINARY(5)的表插入从FLOAT列取出的值:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
m_db=# CREATE TABLE varchar_storage (
    VS_COL1 BINARY(5)
);
m_db=# CREATE TABLE float_storage (
    VS_COL1 FLOAT
);
m_db=# INSERT INTO float_storage VALUES(1234567);
m_db=# INSERT INTO varchar_storage SELECT * FROM float_storage ;
INSERT 0 1
m_db=# SELECT * FROM varchar_storage;
 VS_COL1 
---------
 1.2e6
(1 row)
m_db=# DROP TABLE varchar_storage, float_storage;

从FLOAT列向BINARY列进行数据插入时,会搜索系统表中FLOAT到BINARY类型的隐式转换规则,调用对应的类型转换函数。最后,在系统表里找到长度转换函数binary(bpchar, integer, bool)并且应用于结果和存储的字段长。 这个类型相关的函数执行所需的长度检查和额外的空白填充。