根据我在oracle 11g中的理解,
INTEGER相当于NUMBER(38,0)
我正在使用squirrel-sql-3.6
客户端来检查oracle表的数据和元数据。
我使用SQL脚本创建了一个表:
CREATE TABLE "ABC"."TABLE01"
(
NUM_INT INTEGER
)
;
当我点击获取创建表脚本时,它给了我:
CREATE TABLE "ABC"."TABLE01"
(
NUM_INT decimal(22,0)
)
;
我期待NUM_INT类型为十进制(38,0)
我正在使用 Oracle数据库11g第2版(11.2.0.1)ojdbc6.jar
我也尝试过使用Java代码:
try (Connection con = DriverManager.getConnection(connectionUri, userName, password);) {
DatabaseMetaData metadata = con.getMetaData();
ResultSet rs = metadata.getColumns(schemaName, null, tableName, null);
} catch (SQLException e) {
LOG.info("SQLException. Caused By: " + e);
}
输出:
ordinalPosition:1
columnName:NUM_INT
dataType:NUMBER
precision:22
scale:0
columnSize:22
nullable:false
foreignKey:false
autoIncrement:false
这是这个特殊版本的jar的问题吗?
P.S。我正在使用Java 7
答案 0 :(得分:1)
您认为INTEGER映射到NUMBER(38)到Oracle 10.2之前是正确的。
请参阅 ANSI数据类型转换为Oracle数据类型
<强> 9.2 强>
http://docs.oracle.com/cd/B10501_01/server.920/a96540/sql_elements2a.htm#114927
<强> 10.2 强>
http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i54335
从11.2开始,映射定义为
INTEGER NUMBER(p,0)
<强> 11.2 强>
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF00213
<强> 12.1 强>
http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF55581
不幸的是我找不到p
...
JDBC驱动程序可能会在data_length
丢失的情况下使用data_precision
...
CREATE TABLE "TABLE01"
(
NUM_INT INTEGER
)
;
CREATE TABLE "TABLE02"
(
NUM_INT NUMBER(38,0)
)
;
select TABLE_NAME, substr(DATA_TYPE,1,15) DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE
from user_tab_columns where table_name like 'TABLE0_';
TABLE_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE
------------------------------ --------------- ----------- -------------- ----------
TABLE01 NUMBER 22 0
TABLE03 NUMBER 22 38 0
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
我的解释
1)p
中的NUMBER(p,0)
未记录,因此设置为“null
2)JDBC驱动程序看不到精度,因此需要长度而不是它。
我不确定这是否是绝对正确的行为,但我会尽量避免使用非Oracle数据类型。
答案 1 :(得分:0)
可显示的十进制数字与存储这些数字的字节数之间存在一些混淆。
查看NUMBER
data type documentation:
NUMBER数据类型
使用以下格式指定定点数:
NUMBER(p,s)
其中:
p
是精确度或有效小数位的总数,其中最高有效位是最左边的非零数字,最低有效位是最右边的已知数字。 Oracle保证数字的可移植性,精度最高可达20个base-100位,相当于39或40个十进制数字,具体取决于小数点的位置。s
是从小数点到最低有效数字的比例或位数。比例范围可以从-84到127。
内部数字格式
Oracle以可变长度格式存储数字数据。每个值都以科学计数法存储,1个字节用于存储指数,最多20个字节用于存储尾数。结果值限制为38位精度。 Oracle不存储前导零和尾随零。例如,数字412以类似于4.12×102的格式存储,其中1个字节用于存储指数(2),2个字节用于存储尾数(4,1,2)的三个有效数字。负数包括其长度的符号。 因此,Oracle以22个字节存储
NUMBER(38)
- 该数字的最高有效数字使用20个基数-100个数字(每个1个字节)存储,其余数字用于数字的精度(尽管仅限Oracle)保证最多可存储38位小数。)
驱动程序可能正在将Oracle的base-100格式(计数位)中的值转换为十进制浮点表示(计算字节数)。