值存储
值存储数据类型解析
- 查找与目标字段精确匹配的项。
- 尝试将表达式直接转换为目标类型:如果这两种类型之间存在已注册的转换函数,那么将直接调用该转换函数;如果表达式为未知类型(unknown、unspecified类型)文本,该文本字符串的内容将转换为目标类型。
- 检查目标类型是否支持长度转换(长度转换指从某类型到其自身的转换)。如果在pg_cast表里面检索到对应的长度转换规则,那么在表达式存储到目标字段前,先对其应用该转换。这类转换函数需要接收一个integer类型的必选参数,用于标识目标字段的atttypmod值(即字段声明长度,atttypmod的解释因数据类型而异);此外,这类转换函数还可以接收一个Boolean类型的可选参数,用于标识转换是显式的还是隐式的。转换函数需要负责实现与长度相关的语义逻辑,例如长度检查、内容截断等。
ORA兼容模式常用类型支持的类型转换
| 源类型 | 支持转换的目标类型 |
|---|---|
| int1 | int2, int4, int8, float4, float8, numeric, bpchar, varchar, nvarchar2, clob |
| int2 | int1, int4, int8, float4, float8, numeric, bpchar, varchar, nvarchar2, clob |
| int4 | int1, int2, int8, float4, float8, numeric, bpchar, varchar, nvarchar2, clob |
| int8 | int1, int2, int4, float4, float8, numeric, bpchar, varchar, nvarchar2, clob |
| float4 | int1, int2, int4, int8, float8, numeric, bpchar, varchar, nvarchar2, clob |
| float8 | int1, int2, int4, int8, float4, numeric, bpchar, varchar, nvarchar2, clob |
| numeric | int1, int2, int4, int8, float4, float8, bpchar, varchar, nvarchar2, clob |
| date | timestamp, timestamptz, bpchar, varchar |
| datea | timestamp, timestamptz, bpchar, varchar, nvarchar2, clob |
| timestamp | datea, timestamptz, varchar, nvarchar2, clob |
| timestamptz | timestamp, datea, clob |
| bpchar | int4, int8, float4, float8, numeric, date, datea, timestamp, varchar, nvarchar2, clob |
| varchar | int4, int8, float4, float8, numeric, date, datea, timestamp, bpchar, nvarchar2, clob, raw, blob |
| nvarchar2 | int4, numeric, datea, timestamp, bpchar, varchar, clob |
| clob | int1, int2, int4, int8, float4, float8, numeric, datea, timestamp, bpchar, varchar, nvarchar2 |
| raw | varchar, blob |
| blob | raw |
| xml | bpchar, varchar, nvarchar2, clob |
| xmltype | - |
示例
character存储类型转换。对一个目标列定义为character(20)的语句,下面的语句显示存储值的长度正确:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | gaussdb=# CREATE SCHEMA tpcds; gaussdb=# CREATE TABLE tpcds.value_storage_t1 ( VS_COL1 CHARACTER(20) )DISTRIBUTE BY HASH (VS_COL1); gaussdb=# INSERT INTO tpcds.value_storage_t1 VALUES('abcdef'); gaussdb=# SELECT VS_COL1, octet_length(VS_COL1) FROM tpcds.value_storage_t1; vs_col1 | octet_length ----------------------+-------------- abcdef | 20 (1 row) ) gaussdb=# DROP TABLE tpcds.value_storage_t1; gaussdb=# DROP SCHEMA tpcds; |
两个unknown文本缺省解析成text,这样就允许||操作符解析成text连接。然后操作符的text结果转换成bpchar("空白填充的字符型",character类型内部名称)以匹配目标字段类型。从text到bpchar的转换是二进制兼容的,这样的转换是隐含的并且实际上不做任何函数调用。在系统表里找到长度转换函数bpchar(bpchar, integer, Boolean)并且应用于该操作符的结果和存储的字段长。这个类型相关的函数执行所需的长度检查和额外的空白填充。