暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle什么情况下发生隐式转换?

原创 陈毅斌 2019-03-21
2155

问题描述

详细列举不同数据类型间的隐式转换方向

专家解答

oracle对不同数据类型具有显示转换和隐式转换2种。

Oracle官方建议使用显示转换,原因包括以下几点:

1.       使用显示转换更方便理解sql语句

2.       隐式转换可能会降低sql语句的性能(比如隐式转换不会使用普通索引)

3.       在不同的环境下,隐式转换可能不会一直有效。比如datetime  to varchar2的转换,依赖于参数NLS_DATE_FORMAT,这个参数在不同会话或者客户端都可能会不同。

4.       计算类型(Algorithms)的隐式转换在不同的oracle版本上会有所不同。同一条隐式转换的sql在不同数据库版本上可能会有不同的结果。


隐式转换的规则:

1.     insert和update语句,oracle只转换被影响的字段(insert为所有字段,update为指定字段)

2.     select from语句,oracle为了目标对象可用而转换字段类型。

3.     当要进行数值类型的转换时,oracle调整精准度到最大可用。

4.     当对比字符型和数值型时,oracle把字符型转换为数据类型

5.     当对比字符型和date型时,oracle把字符型转换为date型(不知道timestamp会怎样)

6.     当使用等号时,右边的类型转换为左边的类型

7.     当转换字符型或number型和浮点型时可能会不精准,因为字符和number使用的是小数decimal准度,而浮点型使用的是binary准度。

8.     当clob转换为varchar2,blob,raw时,如果数据过大,转换会失败。char只有4000 bytes(char(2000)),clob转换为char只转换到4000bytes。

9.     当timestamp类型转换为date时(按照第三条,隐式转换不应该把timestamp转换为date,除非insert这样的),timestamp后几位会被truncated忽略,至于忽略几位,取决于数据库版本。

10.  binary_float to binary_double的转换很精确,binary_double to binary_float不精确,因为binary_double精度更高。(高精度到低精度会有不精准的情况,这也是为什么有第三条规则)

11.  concatenation连接操作,oracle会隐式转换非字符型到字符型

12.  当有计算操作时,oracle转换字符型到数值,date,rowid等类型

13.  When converting RAW or LONG RAW data to and from character data, the binary data is represented in hexadecimal form, with one hexadecimal character representing every four bits of RAW data.

14.  自定义类型不能隐式转换,可用cast multiset显示转换。

15.  Char、varchar2、nchar、nvarchar2类型可相互转换

最后修改时间:2019-04-14 10:22:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论