#数据类型转换

数据类型转换多发生在操作的输入类型与规定类型不一致,或一个表达式中包含多个不同数据类型的情况中,此时,可以通过隐式转换或显式转换来整合数据类型。

# 隐式转换(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 ✓
LTZ X X X X X X X ✓
TZ 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 ✓
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 ✓
BFILE X X X X X X X ✓

(2)

原类型\目标类型 DATE TIMESTAMP LTZ TZ YM_INTERVAL DS_INTERVAL TIME BOOLEAN
TINYINT X X X X X X X ✓
SMALLINT X X X X X X X ✓
INT X X X X X X X ✓
BIGINT X 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
TIMESTAMP ✓ -- ✓ ✓ X X ✓ X
LTZ ✓ ✓ -- ✓ X X ✓ X
TZ ✓ ✓ ✓ -- X X ✓ X
YM_INTERVAL X X X X -- X X X
DS_INTERVAL X X X X X -- ✓ X
TIME ✓ ✓ ✓ ✓ X ✓ -- X
BOOLEAN X X X X X X ✓ --
BIT X X X X X X X ✓
CLOB X X X X X X X X
BLOB X X X X X X X X
NCLOB X X X X X X X X
RAW X X X X X X X X
JSON X X X X X X X X
ROWID X X X X X X X X
UROWID X X X X X X X X
BFILE X X X X X X X X

(3)

原类型\目标类型 BIT CLOB BLOB NCLOB RAW JSON ROWID UROWID BFILE
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
字符型 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ X
DATE X X X X X X X X X
TIMESTAMP X X X X X X X X X
LTZ X X X X X X X X X
TZ X 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
RAW X ✓ ✓ ✓ -- ✓ ✓ ✓ X
JSON X ✓ ✓ ✓ ✓ -- X ✓ X
ROWID X X X X ✓ X -- ✓ X
UROWID X ✓ ✓ ✓ ✓ ✓ ✓ -- X
BFILE X ✓ ✓ X X ✓ X X --
  • ① 仅支持特定字符串转换为BOOLEAN类型,具体请查阅布尔型。

# 显式转换(Explicit Data Conversion)

显式转换是通过类型转换函数来清楚直言地指定转换的方向。相比隐式转换,显式转换可以使SQL语句更加容易理解,输出类型的可预测性更强。

下表举例列示YashanDB内置的一些类型转换函数:

函数 功能
BIN 其他类型向BIT类型转换(返回结果以VARCHAR类型承载该BIT值)。
CAST 指定向任意类型转换。
NUMTODSINTERVAL 数值型向INTERVAL DAY TO SECOND类型转换。
NUMTOYMINTERVAL 数值型向INTERVAL YEAR TO MONTH类型转换。
ROWIDTOCHAR ROWID类型向VARCHAR类型转换。
SCN_TO_TIMESTAMP BIGINT类型向TIMESTAMP类型转换。
TIMESTAMP_TO_SCN TIMESTAMP类型向BIGINT类型转换。
TO_BLOB 其他类型向BLOB类型转换。
TO_CHAR 其他类型向VARCHAR类型转换。
TO_DATE 其他类型向DATE类型转换。
TO_DSINTERVAL 其他类型向INTERVAL DAY TO SECOND类型转换。
TO_NUMBER 其他类型向NUMBER类型转换。
TO_TIMESTAMP 其他类型向TIMESTAMP类型转换。
TO_TIMESTAMP_TZ 其他类型向TIMESTAMP WITH TIME ZONE类型转换。
TO_YMINTERVAL 其他类型向INTERVAL YEAR TO MONTH类型转换。
JSON 字符串类型向JSON类型转换。
JSON_SERIALIZE JSON类型向字符串类型转换。
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流