通常,表达式不能包含不同数据类型的值。但是为了使表达式能够进行计算,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 控制台的操作流程引导。您可查看 TPS(Transactions Per Second,每秒事务数)、QPS(Queries P...
出于业务需要,您可以在迁移项目启动前编辑项目配置,本文档为您展示编辑项目配置的基本操作流程。 注意事项仅支持修改状态为未...
ContentHandlerjava.lang.Object |---java.net.ContentHandlerpublic abstract class ContentHandlerextends Object抽象类 Conte...
Socketjava.lang.Object |---java.net.Socketpublic class Socketextends Objectimplements Closeable此类实现客户端套接字(也...
NavigableSetpublic interface NavigableSetEextends SortedSetE使用导航方法扩展的 SortedSet,报告给定搜索目标的最接近匹配。...
联系我们开发过程中遇到任何问题,请前往微信开放社区提问。 提问时,建议标题以【物流助手】开头,会第一时间解答你的疑问。...
为了满足大家查询需要,我们收集并整理了一份 :微信小程序导航大全你可以很方便的通过扫二维码去使用这些小程序。wx.navigateTo(...