oracle数据隐型转换
目前oracle针对库内数据存在两种转换方式,显示类型转换与隐式类型转换。
如果语句进行比较运算的数据的数据类型各不相同时,oracl而会将其中不相同的类型进行类型转换使其能够进行运算,这种转换属于是自动类型的,进行的前提是有意义
隐式转换规则-摘抄部分常见
- 对于INSERT和UPDATE操作,ORACLE会把插入值或者更新值隐式转换为对应字段的数据类型。
- 对于SELECT语句,ORACLE会把字段的数据类型隐式转换为变量的数据类型
- 当比较一个字符型和数值型的值时,ORACLE会把字符型的值隐式转换为数值型
- 将CLOB值转换为字符数据类型(例如VARCHAR2)或将BLOB转换为RAW数据时,如果要转换的数据大于目标数据类型,则数据库将返回错误
- 当处理数值时,ORACLE通常会调整精度和小数位,以实现最大容量。会造成数据类型与实际数据类型不匹配
- 比较CHAR/VARCHAR2 和NCHAR/NVARCHAR2时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集
- 如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算,则ORACLE会将字符类型的数据转换为合适的数据类型,这些数据类型可能是number、date、rowid等
- 表链接操作,oracle会隐形转换非字符到字符
- 使用=号时,默认将等号右边类型转换为左边的类型
- 比较CHAR/VARCHAR2 和NCHAR/NVARCHAR2时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集
隐式转换注意点,主要为字符型转换为日期型,由于日期型转换与变量NLS_DATE_FORMAT关联(涉及到日期的格式),所以容易出现逻辑错误
sql
#查询含有存在隐式转换数据类型的sql语句(只能获取到内存(高速缓存中)中保存的sql,即至少执行过一次的sql计划)
SELECT SQL_ID,PLAN_HASH_VALUE FROM V$SQL_PLAN X WHERE X.FILTER_PREDICATES LIKE '%INTERNAL_FUNCTION%'GROUP BY SQL_ID,PLAN_HASH_VALUE;
#依照sql解析计划进行查找
SELECT SQL_ID,PLAN_HASH_VALUE FROM V$SQL_PLAN X WHERE X.FILTER_PREDICATES LIKE '%SYS_OP_C2C%'GROUP BY SQL_ID,PLAN_HASH_VALUE;
#v$sql_plan含有两个字段,FILTER_PREDICATES与Access_PREDICATES。这两个字段专门用于对sql语句中的谓词进行解释,具有很大区分,一个是面向含有索引的sql表语句,另外一个是面向没有索引的sql表语句。
#直接就sql语句而言
#Access_PREDICATES:知道要取什么数据,在哪里取,直接取--索引
#FILTER_PREDICATES:先把数据取出,然后判断是否满足条件--无索引