#数据类型转换
数据类型转换多发生在操作的输入类型与规定类型不一致,或一个表达式中包含多个不同数据类型的情况中,此时,可以通过隐式转换或显式转换来整合数据类型。
# 隐式转换(Implicit Data Conversion)
隐式转换表示在原始数据类型和目标数据类型不一致,且用户未指定类型转换函数时,YashanDB会运用一套转换规则来尝试转换数据类型,帮助用户降低SQL语句的编写难度,但如果超出了默认的转换范围,相应的SQL语句会报错。
以下场景中YashanDB默认进行隐式转换:
- INSERT/UPDATE语句中,要插入的数据将被转换成目标列的类型。
- 算术运算时,对参与运算的数据类型进行转换。
- 比较运算中,参与运算的数据类型不一致时,进行转换。
- 当向函数输入的参数为与定义不相符的数据类型时,该参数将先被隐式转换为可以接受的数据类型。
- PL或接口程序中,Filter Condition使用绑定参数时,当输入的参数为与绑定列不相符的数据类型时,该参数将先被隐式转换为可以接受的数据类型。(绑定列为数值型时,输入参数将被执行向NUMBER类型的隐式转换)
执行隐式转换可能导致如下问题:
- FLOAT/DOUBLE类型本身是不精确的数据类型,执行与它们之间的类型可能会导致精度差异。
- 从TIMESTAMP转换为DATE,微秒会被舍弃。
下列表列示YashanDB支持的所有隐式转换:(列表示原始类型;行表示目标类型;✓表示支持转换,X表示不支持转换,--表示无需转换)
(1)
TINYINT | SMALLINT | INT | BIGINT | NUMBER | FLOAT | DOUBLE | 字符型 | |
---|---|---|---|---|---|---|---|---|
TINYINT | -- | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
SMALLINT | ✓ | -- | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
INT | ✓ | ✓ | -- | ✓ | ✓ | ✓ | ✓ | ✓ |
BIGINT | ✓ | ✓ | ✓ | -- | ✓ | ✓ | ✓ | ✓ |
NUMBER | ✓ | ✓ | ✓ | ✓ | -- | ✓ | ✓ | ✓ |
FLOAT | ✓ | ✓ | ✓ | ✓ | ✓ | -- | ✓ | ✓ |
DOUBLE | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -- | ✓ |
字符型 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -- |
DATE | X | X | X | X | X | X | X | ✓ |
TIMESTAMP | X | X | X | X | X | X | X | ✓ |
YM_INTERVAL | X | X | X | X | X | X | X | ✓ |
DS_INTERVAL | X | X | X | X | X | X | X | ✓ |
TIME | X | X | X | X | X | X | X | ✓ |
BOOLEAN | ✓ | ✓ | ✓ | ✓ | ✓ | X | X | ✓① |
BIT | ✓ | ✓ | ✓ | ✓ | ✓ | X | X | ✓ |
CLOB | X | X | X | X | X | X | X | ✓ |
BLOB | X | X | X | X | X | X | X | ✓ |
NCLOB | X | X | X | X | X | X | X | ✓ |
XMLTYPE | X | X | X | X | X | X | X | ✓② |
RAW | X | X | X | X | X | X | X | ✓ |
JSON | X | X | X | X | X | X | X | ✓ |
ROWID | X | X | X | X | X | X | X | ✓ |
UROWID | X | X | X | X | X | X | X | ✓ |
(2)
DATE | TIMESTAMP | YM_INTERVAL | DS_INTERVAL | TIME | BOOLEAN | |
---|---|---|---|---|---|---|
TINYINT | X | X | X | X | X | ✓ |
SMALLINT | X | X | X | X | X | ✓ |
INT | X | X | X | X | X | ✓ |
BIGINT | X | X | X | X | X | ✓ |
NUMBER | X | X | X | X | X | X |
FLOAT | X | X | X | X | X | X |
DOUBLE | X | X | X | X | X | X |
字符型 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓① |
DATE | -- | ✓ | X | X | X | X |
TIMESTAMP | ✓ | -- | X | X | X | X |
YM_INTERVAL | X | X | -- | X | X | X |
DS_INTERVAL | X | X | X | -- | ✓ | X |
TIME | X | X | X | ✓ | -- | X |
BOOLEAN | X | X | X | X | X | -- |
BIT | X | X | X | X | X | ✓ |
CLOB | X | X | X | X | X | X |
BLOB | X | X | X | X | X | X |
NCLOB | X | X | X | X | X | X |
XMLTYPE | X | X | X | X | X | X |
RAW | X | X | X | X | X | X |
JSON | X | X | X | X | X | X |
ROWID | X | X | X | X | X | X |
UROWID | X | X | X | X | X | X |
(3)
BIT | CLOB | BLOB | NCLOB | XMLTYPE | RAW | JSON | ROWID | UROWID | |
---|---|---|---|---|---|---|---|---|---|
TINYINT | ✓ | ✓ | X | ✓ | X | X | X | X | X |
SMALLINT | ✓ | ✓ | X | ✓ | X | X | X | X | X |
INT | ✓ | ✓ | X | ✓ | X | X | X | X | X |
BIGINT | ✓ | ✓ | X | ✓ | X | X | X | X | X |
NUMBER | ✓ | ✓ | X | ✓ | X | X | X | X | X |
FLOAT | X | ✓ | X | ✓ | X | X | X | X | X |
DOUBLE | X | ✓ | X | ✓ | X | X | X | X | X |
字符型 | ✓ | ✓ | ✓ | ✓ | ✓② | ✓ | ✓ | ✓ | ✓ |
DATE | X | X | X | X | X | X | X | X | X |
TIMESTAMP | ✓ | X | X | X | X | X | X | X | X |
YM_INTERVAL | X | X | X | X | X | X | X | X | X |
DS_INTERVAL | X | X | X | X | X | X | X | X | X |
TIME | X | X | X | X | X | X | X | X | X |
BOOLEAN | ✓ | X | X | X | X | X | X | X | X |
BIT | -- | X | X | X | X | X | X | X | X |
CLOB | X | -- | X | X | ✓ | X | ✓ | X | X |
BLOB | X | X | -- | X | X | ✓ | ✓ | X | ✓ |
NCLOB | X | ✓ | X | -- | X | X | ✓ | X | X |
XMLTYPE | X | X | X | X | -- | X | X | X | X |
RAW | X | ✓ | ✓ | X | X | -- | ✓ | ✓ | ✓ |
JSON | X | ✓ | ✓ | ✓ | X | ✓ | -- | X | X |
ROWID | X | X | X | X | X | ✓ | X | -- | ✓ |
UROWID | X | ✓ | ✓ | X | X | ✓ | X | ✓ | -- |
① 仅支持特定字符串转换为BOOLEAN类型,具体请查阅布尔型。
② XMLTYPE类型仅支持与字符型中的CHAR和VARCHAR类型进行相互转换。
# 显式转换(Explicit Data Conversion)
显式转换是通过类型转换函数来清楚直言地指定转换的方向。相比隐式转换,显式转换可以使SQL语句更加容易理解,输出类型的可预测性更强。
下表举例列示YashanDB内置的一些类型转换函数:
函数 | 功能 |
---|---|
BIN | 其他类型向BIT类型转换。 |
NUMTODSINTERVAL | 数值型向INTERVAL DAY TO SECOND类型转换。 |
NUMTOYMINTERVAL | 数值型向INTERVAL YEAR TO MONTH类型转换。 |
SCN_TO_TIMESTAMP | BIGINT类型向TIMESTAMP类型转换。 |
TIMESTAMP_TO_SCN | TIMESTAMP类型向BIGINT类型转换。 |
TO_CHAR | 其他类型向VARCHAR类型转换。 |
TO_NUMBER | 其他类型向NUMBER类型转换。 |
TO_DATE | 其他类型向DATE类型转换。 |
TO_TIMESTAMP | 其他类型向TIMESTAMP类型转换。 |
TO_YMINTERVAL | 其他类型向INTERVAL YEAR TO MONTH类型转换。 |
TO_DSINTERVAL | 其他类型向INTERVAL DAY TO SECOND类型转换。 |
JSON | 字符串类型向JSON类型转换。 |
JSON_SERIALIZE | JSON类型向字符串类型转换。 |
CAST | 指定向任意类型转换。 |