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:先把数据取出,然后判断是否满足条件--无索引
相关推荐
GBASE7 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr17 小时前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3502 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3502 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3502 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB3 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶3 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵3 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql