在Teradata中,我们可以用Number(*) or Number
这样的东西来定义数字类型,根据Teradata的指导方针,定义
表示具有系统精度和比例限制的NUMBER
精度和刻度不是固定定义的,取决于所谓的系统极限。
我用resultSet.getMetaData.getPrecision(index)
和resultSet.getMetaData.getPrecision(index)
得到precision
和scale
,在这种情况下,precision
等于40
,scale
等于0
。
JDBC返回的精度和比例显然与Teradata不一致,虽然这里我们不知道具体的比例限制,但它确实是一个大于0
的值,否则会违背所谓的系统限制。
我们可以通过在Teradata中创建一个表来做一个练习,例如:
create set table test_db.test(id BIGINT, column1 NUMBER, column2 NUMBER) PRIMARY INDEX (id);
并插入规模较大的数据,如12.3456789,上面的插入是有效的,并表明JDBC返回的规模实际上是不正确的?如何通过JDBC获得正确的刻度值?
注意,如果Number
用明确的精度和比例定义,如:create set table test_db.test_with_explicit_ps(id BIGINT, column1 NUMBER(20,10), column2 NUMBER(28,10)) PRIMARY INDEX (id);
JDBC可以通过resultSet.getMetaData.getPrecision/Scale(index)
返回正确的精度和比例。
ResultSetMetaData的JDBC API规范。getScale方法表示"获取指定列在小数点右边的位数"。对于不适用比例的数据类型返回0。">
https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/ResultSetMetaData.html getScale (int)
如果省略了NUMBER数据类型的比例,或者为NUMBER数据类型的比例指定了星号(*),则Teradata数据库向Teradata JDBC驱动程序指示该比例不可用。
在这种情况下,当数据库告诉JDBC驱动程序该比例不可用时,那么JDBC驱动程序将为ResultSetMetaData中的比例返回零(0)。getScale方法,根据JDBC API规范