如何通过 JDBC 获得 Teradata 数字类型的精度和小数位数



在Teradata中,我们可以用Number(*) or Number这样的东西来定义数字类型,根据Teradata的指导方针,定义

表示具有系统精度和比例限制的NUMBER

精度和刻度不是固定定义的,取决于所谓的系统极限

我用resultSet.getMetaData.getPrecision(index)resultSet.getMetaData.getPrecision(index)得到precisionscale,在这种情况下,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规范

最新更新