Oracle数据类型转换

一般来说,一个表达式不能包含不同数据类型的值。例如,一个表达式不能5乘以10,然后加上'JAMES'。但是,Oracle支持隐式和显式两种转换值从一种数据类型到另一种数据类型。

隐式和显式数据转换

Oracle建议具体指定显示转换,而不是依赖隐式或自动转换,因为这些原因:

  • 使用显式类型转换函数,SQL语句更容易理解。
  • 隐式类型转可能会对性能产生负面影响,尤其是如果列值的数据类型被转换为一个常数,而不是其他值。
  • 隐式转换依赖于它发生时的上下文,相同的方式在其他情况下可能不生效。例如,datetime值隐式转换为varchar2依赖于NLS_DATE_FORMAT参数的值,可能会返回一个意想不到的年份。
  • 隐式转换的算法受Oracle软件版本和Oracle产品的改变而变化,显式转换的行为更容易预测。

隐式数据转换

Oracle数据库会自动转换从一个数据类型的值时,这种转换是有道理的。隐式转换为字符数据类型遵循以下规则:

隐式转换表

CHAR VARCHAR2 NCHAR NVARCHAR2 DATE DATETIME/INTERVAL NUMBER BINARY_FLOAT BINARY_DOUBLE LONG RAW ROWID CLOB BLOB NCLOB

CHAR

--

X

X

X

X

X

X

X

X

X

X

--

X

X

X

VARCHAR2

X

--

X

X

X

X

X

X

X

X

X

X

X

--

X

NCHAR

X

X

--

X

X

X

X

X

X

X

X

X

X

--

X

NVARCHAR2

X

X

X

--

X

X

X

X

X

X

X

X

X

--

X

DATE

X

X

X

X

--

--

--

--

--

--

--

--

--

--

--

DATETIME/ INTERVAL

X

X

X

X

--

--

--

--

--

X

--

--

--

--

--

NUMBER

X

X

X

X

--

--

--

X

X

--

--

--

--

--

--

BINARY_FLOAT

X

X

X

X

--

--

X

--

X

--

--

--

--

--

--

BINARY_DOUBLE

X

X

X

X

--

--

X

X

--

--

--

--

--

--

--

LONG

X

X

X

X

--

X1

--

--

--

--

X

--

X

--

X

RAW

X

X

X

X

--

--

--

--

--

X

--

--

--

X

--

ROWID

--

X

X

X

--

--

--

--

--

--

--

--

--

--

--

CLOB

X

X

X

X

--

--

--

--

--

X

--

--

--

--

X

BLOB

--

--

--

--

--

--

--

--

--

--

X

--

--

--

--

NCLOB

X

X

X

X

--

--

--

--

--

X

--

--

X

--

--

Note 1: You cannot convert LONG to INTERVAL directly, but you can convert LONG to VARCHAR2 using TO_CHAR(interval), and then convert the resulting VARCHAR2 value to INTERVAL.

 

Oracle数据库根据以下面的这些规则,进行隐式数据类型转换:

  • INSERT 和UPDATE操作时,Oracle把变量值转换成列类型。
  • SELECT FROM 操作时,Oracle把列数据类型转换成目标变量类型。
  • 字符值和数字值比较时,Oracle把字符值转换成数字值。
  • 字符值或数值和浮点数值之间的转换可以是不精确的,因为字符类型和数量使用十进制精度来表示数值,浮点数使用二进制精度。
  • 当一个CLOB值转换为一个字符类型如VARCHAR2,或BLOB转换为RAW时。如果要转换的数据大于目标数据类型,那么数据库会返回一个错误。
  • 单精度二进制转换为双精度二进制是精确的。
  • 双精度二进制转换为单精度二进制是不精确的,如果双精度二进制值的精度位数超出了单精度二进制支持的位数。
  • 当字符类型和日期类型比较时,Oracle将字符类型数据转换成日期类型。
  • 赋值操作时,Oracle把等号右边的值转换成左边赋值目标数据类型。
  • 连接操作时,Oracle把非字符类型转换成字符类型或国家字符类型。
  • 在字符类型与非字符类型之间进行算术运算和非算术运算时,Oracle转换任意字符类型为数字、日期或ROWID,要视情况而定。在CHAR/VARCHAR2 和NCHAR/NVARCHAR2之间进行算术运算,Oracle转换为数字。

 

显式数据转换

可以明确地指使用SQL转换函数转换数据类型,SQL函数显示转换一个数据类型为另一个数据类型:

显式类型转换

to CHAR,VARCHAR2,NCHAR,NVARCHAR2 to NUMBER to Datetime/Interval to RAW to ROWID to LONG,LONG RAW to CLOB, NCLOB,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

CHARTO­=ROWID

--

TO_CLOB

TO_NCLOB

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

from NUMBER

TO_CHAR (number)

TO_NCHAR (number)

--

TO_DATE

NUMTOYM- INTERVAL

NUMTODS- INTERVAL

--

--

--

--

TO_BINARY_FLOAT

TO_BINARY_DOUBLE

from Datetime/ Interval

TO_CHAR (date)

TO_NCHAR (datetime)

--

--

--

--

--

--

--

--

from RAW

RAWTOHEX

RAWTONHEX

--

--

--

--

--

TO_BLOB

--

--

from ROWID

ROWIDTOCHAR

--

--

--

--

--

--

--

--

from LONG / LONG RAW

--

--

--

--

--

--

TO_LOB

--

--

from CLOB, NCLOB, BLOB

TO_CHAR

TO_NCHAR

--

--

--

--

--

TO_CLOB

TO_NCLOB

--

--

from CLOB, NCLOB, BLOB

TO_CHAR

TO_NCHAR

--

--

--

--

--

TO_CLOB

TO_NCLOB

--

--

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值