问题描述
详细列举不同数据类型间的隐式转换方向
专家解答
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类型可相互转换