DBA之路--oracle数据隐型转换

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:先把数据取出,然后判断是否满足条件--无索引
相关推荐
SkyWalking中文站10 小时前
BanyanDB 0.11.0:新特性与升级指南
数据库
₍˄·͈༝·͈˄*₎◞ ̑̑码11 小时前
MyBatis操作数据库
数据库·mybatis
刃神太酷啦13 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
丁丁点灯o13 小时前
Oracle中使用外键的场景及不适用外键的情况
数据库·oracle
天天进步201513 小时前
Pixelle-Video 源码解析 #18:声音克隆功能:参考音频如何影响解说效果?
数据库·音视频
不懂的浪漫14 小时前
ToDesk 连接 Linux 后分辨率过低的解决方法
linux·运维·数据库
布莱克60514 小时前
Redis 详解:从核心数据结构到高可用架构
数据库
冰暮流星15 小时前
mysql之左外连接与右外连接
数据库·sql
jyOverQ15 小时前
MySQL 联合索引怎么用?最左匹配原则到底是什么意思?
数据库·mysql
oradh15 小时前
Oracle enq: US - contention 等待事件总结
数据库·oracle