• 自动转型带来的问题

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='…'要将字符串转为ROWID,where date ='….'会将字符串根据nls的设置转为日期类型。

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

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

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

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

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

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