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:先把数据取出,然后判断是否满足条件--无索引
相关推荐
Super 含6 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
ltl6 小时前
向量检索引擎选型:决策树、RAG 回链与开放问题
数据库
坚持学习前端日记7 小时前
Python SQLAlchemy ORM 从0到1精通实战手册(基础到复杂高阶)
数据库·python·oracle
灯澜忆梦7 小时前
【MySQL17】进阶篇 | InnoDB引擎
数据库·mysql
anxiao_m7 小时前
2026制造业云桌面选型攻略,不同生产场景适配方案汇总
大数据·网络·数据库
许彰午7 小时前
# 数据库配拦截器,不用改BPMN
数据库
lv__pf8 小时前
redis【msb 2026金三银四redis上】
数据库·redis·缓存
布莱克6059 小时前
理解数据库聚簇索引:原理、优势与适用场景
数据库·mysql
Nturmoils9 小时前
只面对一张表:KingbaseES 超表如何简化海量时序数据管理
数据库