Oracle 19c中使用标准JDBC检测INTEGER列是否仅依赖精度与刻度?
Oracle 19c JDBC中INTEGER列的检测方法
在Oracle 19c环境下,JDBC驱动会将建表时定义为INTEGER类型的列映射为java.sql.Types.NUMERIC,且元数据显示该列精度为38、刻度为0。仅通过precision == 38和scale == 0这两个条件,没法精准判定该列原本是INTEGER类型,同时这也不是唯一的检测手段——借助标准JDBC元数据还有更可靠的判断方式:
- 首先要明确,Oracle的
INTEGER本质是NUMBER(38,0)的别名,JDBC驱动返回NUMERIC类型是符合规范的,因为Oracle没有对应JDBCINTEGER的原生类型。 - 标准JDBC提供的
ResultSetMetaData.getColumnTypeName()方法可以获取数据库中的原生类型名,这不属于厂商特定扩展:- 如果列是通过
CREATE TABLE ... (col INTEGER)创建的,该方法会返回INTEGER; - 如果列是通过
CREATE TABLE ... (col NUMBER(38,0))创建的,该方法会返回NUMBER。
将这个返回值与精度、刻度的判断结合,就能准确区分原本的INTEGER列和普通的NUMBER(38,0)列。
- 如果列是通过
- 若仅依赖精度和刻度判断,会把
NUMBER(38,0)也误判为INTEGER——因为二者在Oracle中的存储逻辑完全一致,JDBC驱动仅通过类型编码和数值属性无法区分,必须借助原生类型名辅助判断。
总结:仅靠精度38、刻度0不是唯一检测方法,结合getColumnTypeName()的结果,才能更准确识别出原本定义为INTEGER的列。
内容的提问来源于stack exchange,提问作者mjn
相关产品推荐
相关产品推荐

