ORACLE 自动类型转换

  • 自动转型带来的问题

1)降低可读性

2)自动类型转换往往对性能产生不好的影响,特别是左值的类型被自动转成了右值的类型,这种方式很可能使左值上的索引失效。

3)自动类型转换可能依赖于发生转换时的上下文环境,一旦上下文环境改变,很可能我们的程序就不能运行

如:select to_date(sysdate,'yyyymm') from dual;

这个语句等价于select to_date(to_char(sysdate, nls_date_format),'yyyymm') from dual;

 

 

  • 数据类型优先级

Datetime and interval 类型

BINARY_DOUBLE

BINARY_FLOAT

NUMBER

字符类型

所有其它内置类型

 

 

  • 自动类型转换规则

Oracle自动类型转换是根据上下文环境以及一些预定的规则,经过语法语义的分析之后进行相关的自动类型转换,自动类型转换首要条件就是这个转换有意义,要正确,否则转换不成功,要报错。


自动类型转换矩阵图

1)在insert,update,赋值语句(如SELECT...INTO...)中,Oracle将赋值的类型转为目标列的类型

2)对数值类型的操作,Oracle经常将数值类型的值调整为最大的精度(precision)和刻度(scale)

3)在字符和非字符之间的算术和比较操作中,ORACLE会根据日期,ROWID,数值类型优先级最大来进行转换。算术操作一般都要转为NUMBER,比如where rowid='…'要将字符串转为ROWIDwhere date ='….'会将字符串根据nls的设置转为日期类型。

4)在字符类型、NUMBER数值类型与浮点类型的数值之间相互转换,可能会丢失精度,因为NUMBER是以10进制(0-9)精度表示数字的,而浮点类型数值是以二进制(01)表示的精度。

5)将CLOB转为字符类型或将BLOB转为RAW类型的时候,如果被转换的类型长度比目标类型长,那么会出错,其它的自动类型转换如果无法转换的话也会报错

6)BINARY_FLOAT自动转为BINARY_DOUBLE是准确的,当然这毋庸置疑。反之,BINARY_DOUBLE自动转为BINARY_FLOAT可能就是不准确的了,如BINARY_DOUBLE转为BINARY_FLOAT需要更多的精度位的支持。

7)在做连接操作(||)的时候,Oracle会将非字符类型转为CHARNCHAR

8)字符类型之间的类型转换,CHAR-->VACHAR2-->NCHAR-->NVARCHAR2

9)很多SQL函数可以接受CLOB类型,对参数要求是VARCHAR2CHAR的如果传入CLOB类型也是可以的,但是有最大长度限制为4000字节,也就是说如果CLOB超过4000字节只取前4000字节。

  • 参考文档见附件

     

     

     

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值