codecamp

OceanBase 数据类型转换

通常,表达式不能包含不同数据类型的值。但是为了使表达式能够进行计算,OceanBase 支持从一个数据类型到另一个数据类型的值的隐式转换和显式转换。

隐式数据类型转换

当转换有意义时,OceanBase 数据库会自动将一个值从一种数据类型转换为另一种数据类型。隐式数据类型的转换规则:

  • INSERT 和 UPDATE 操作时,OceanBase 把变量值转换成列类型。
  • SELECT FROM 操作时,OceanBase 把列数据类型转换成目标变量类型。
  • 字符值和数字值比较时,OceanBase 把字符值转换成数字值。

  • 在处理数值时,OceanBase 会调整精度和小数位数。由此产生的数字数据类型与基础表中找到的数字数据类型不同。

  • 字符值或数值和浮点数值之间的转换可以是不精确的,因为字符类型和数量使用十进制精度来表示数值,浮点数使用二进制精度。

  • 当一个 CLOB 值转换为一个字符类型如 VARCHAR2,或 BLOB 转换为 RAW 时。如果要转换的数据大于目标数据类型,那么数据库会返回一个错误。

  • 在从时间戳值转换为 DATE 值的过程中,时间戳值的小数秒部分被截断,且时间戳值的小数秒部分进行四舍五入。

  • 从 BINARY_FLOAT 转换为 BINARY_DOUBLE 是准确的。

  • 如果 BINARY_DOUBLE 的精度位数超出了 BINARY_FLOAT 支持的位数,BINARY_DOUBLE 转换为 BINARY_FLOAT 是不精确的。

  • 当将字符值与 DATE 值进行比较时,OceanBase 将字符数据转换为 DATE

  • 赋值操作时,OceanBase 把等号右边的值转换成左边赋值目标数据类型。

  • 连接操作时,OceanBase 把非字符类型转换成字符类型或国家字符类型。

隐式数据类型转换矩阵

下表显示了所有的隐式数据类型转换,您不需要考虑转换的方向或转换的上下文。“-”表示不支持转换。

数据类型 CHAR VARCHAR2 NCHAR NVARCHAR2 DATE DATETIME / INTERVAL NUMBER BINARY_FLOAT BINARY_DOUBLE RAW CLOB BLOB

CHAR

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

VARCHAR2

Yes

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

-

NCHAR

Yes

Yes

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

-

NVARCHAR2

Yes

Yes

Yes

-

Yes

Yes

Yes

Yes

Yes

Yes

Yes

-

DATE

Yes

Yes

Yes

Yes

-

-

-

-

-

-

-

-

DATETIME / INTERVAL

Yes

Yes

Yes

Yes

-

-

-

-

-

-

-

-

NUMBER

Yes

Yes

Yes

Yes

-

-

-

Yes

Yes

-

-

-

BINARY_FLOAT

Yes

Yes

Yes

Yes

-

-

Yes

-

Yes

-

-

-

BINARY_DOUBLE

Yes

Yes

Yes

Yes

-

-

Yes

Yes

-

-

-

-

RAW

Yes

Yes

Yes

Yes

-

Yes

1

-

-

-

-

Yes

-

CLOB

Yes

Yes

Yes

Yes

-

-

-

-

-

-

-

Yes

BLOB

-

-

-

-

-

-

-

-

-

Yes

-

-

1 您不能直接将 RAW 转换为 INTERVAL,但是可以使用 UTL_RAW.CAST_TO_VARCHAR2([RAW]) 将RAW 转换为 VARCHAR2,然后将所得的 VARCHAR2 值转换为 INTERVAL

不同字符类型之间隐式转换的方向

数据类型 TO_CHAR TO_VARCHAR2 TO_NCHAR TO_NVARCHAR2

from CHAR

-

VARCHAR2

NCHAR

NVARCHAR2

from VARCHAR2

VARCHAR2

-

NVARCHAR2

NVARCHAR2

from NCHAR

NCHAR

NCHAR

-

NCHAR2

from NVARCHAR2

NVARCHAR2

NVARCHAR2

NVARCHAR2

-

隐式数据类型转换示例

执行以下语句:

SELECT 5 * 10 + 'james' FROM DUAL;

语句执行失败,且您收到以下报错:

invalid number

这是由于 OceanBase 使用了隐式数据类型转换,将 'james' 转换为数字类型,但是转换失败。

本示例将字符串 '2' 从 CHAR 数据类型隐式转换为了数字数据类型 2,计算结果为 52

执行以下语句:

SELECT 5 * 10 + '2' FROM  DUAL;

查询结果如下:

+---------------------+
|     5 * 10 + '2'    |     
+---------------------+
|         52          |  
+---------------------+

显式数据类型转换

您可以使用 SQL 转换函数转换数据类型,SQL 函数显式转换一个数据类型为另一个数据类型。

显示类型转换矩阵

数据类型 To CHAR、VARCHAR2、NCHAR、NVARCHAR2 To NUMBER To Datetime/ Interval To RAW To CLOB、BLOB To_BINARY_FLOAT To_BINARY_DOUBLE
From CHAR、VARCHAR2、NCHAR、NVARCHAR2

TO_CHAR(char . ) 、TO_NCHAR(char . )

TO_NUMBER

TO_DATE、TO_TIMESTAMP、TO_TIMESTAMP_TZ、TO_YMINTERVAL、TO_DSINTERVAL

HEXTORAW

TO_CLOB

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

From NUMBER

TO_CHAR(number) 、TO_NCHAR(number)

--

TO_DATE、NUMTOYM_INTERVAL、NUMTOOLS_INTERVAL

--

--

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

From Datetime/Interval

TO_CHAR(date ) 、TO_NCHAR(date)

--

--

--

--

--

--

From RAW

RAWTOHEX、RAWTONHEX

--

--

--

TO_BLOB

--

--

From CLOB、BLOB

TO_CHAR、TO_NCHAR

--

--

--

TO_CLOB

--

--

From BINARY_FLOAT

TO_CHAR(char . ) 、TO_NCHAR(char . )

TO_NUMBER

--

--

--

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

From BINARY_DOUBLE

TO_CHAR(char . ) 、TO_NCHAR(char . )

TO_NUMBER

--

--

--

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

显式数据类型转换示例

当前的时间通过 TO_CHAR 函数显式转换为想要的格式输出。

执行以下语句:

SELECT TO_CHAR(SYSDATE, 'YYYY_MM_DD') FROM DUAL;

查询结果如下:

+-------------------------------+
| TO_CHAR(SYSDATE,'YYYY_MM_DD') |
+-------------------------------+
| 2020_02_27                    |
+-------------------------------+


OceanBase 数据类型优先级
OceanBase 数据转换的安全注意事项
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

OceanBase 控制台指南

OceanBase ODC 使用指南

OceanBase Web 版 ODC

OceanBase 客户端版 ODC

OceanBase Connector/J 开发者指南

OceanBase 什么是OceanBase Connector/J

OceanBase SQL 参考(MySQL 模式)

OceanBase SQL 参考(Oracle 模式)

OceanBase 基本元素

OceanBase 数据库对象

OceanBase 函数

OceanBase 单行函数

OceanBase 返回数字的字符串函数

OceanBase 通用比较函数

OceanBase 编码解码函数

OceanBase SQL 调优指南

OceanBase 相关协议

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }