Java 对于插入的123,数字(5,2)是否应返回123或123.00?
假设我们有一个带有Java 对于插入的123,数字(5,2)是否应返回123或123.00?,java,sql,jdbc,hsqldb,bigdecimal,Java,Sql,Jdbc,Hsqldb,Bigdecimal,假设我们有一个带有数字(5,2)的表,我们将123插入为BigDecimal 当我们选择返回值时-它应该是123(插入时)还是123.00 我在其中一个项目中从HSQLDB1.8.0.10迁移到2.3.3时遇到了这个问题 使用1.8.0.10,我得到插入值的刻度(123,对于插入的123) 在2.3.3中,我得到了列的比例,不管是什么(123.00,对于插入的123) 但我得到了以下回应: 但是数字(5,2)意味着无论插入什么,总有2个小数位数。版本1.8没有遵循SQL标准定义 我不知道这是否
数字(5,2)
的表,我们将123
插入为BigDecimal
当我们选择返回值时-它应该是123
(插入时)还是123.00
我在其中一个项目中从HSQLDB1.8.0.10迁移到2.3.3时遇到了这个问题 使用1.8.0.10,我得到插入值的刻度(
123
,对于插入的123
)
在2.3.3中,我得到了列的比例,不管是什么(123.00
,对于插入的123
)
但我得到了以下回应:
但是数字(5,2)意味着无论插入什么,总有2个小数位数。版本1.8没有遵循SQL标准定义
我不知道这是否正确,但在我看来似乎不合逻辑
我们真的应该在分数部分得到这些零吗,“不管怎样”
下面是我的测试用例:
Connection conn = DriverManager.getConnection(...);
Statement stmt = conn.createStatement();
stmt.executeUpdate("create table test (value NUMERIC(5,2));");
String sql = "INSERT INTO test (value) VALUES(?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setBigDecimal(1, BigDecimal.ONE);
pstmt.executeUpdate();
ResultSet rs = stmt.executeQuery("SELECT * FROM test");
while (rs.next()) {
Assert.assertEquals(BigDecimal.ONE, rs.getBigDecimal(1));
}
rs.close();
stmt.close();
conn.close();
将
123
插入数值(5,2)
列时,正确的值应为123.00
。这是正确的,因为对于数值,值总是转换为具有目标数据类型的精度。在您的情况下,指定的精度为5,刻度为2。只有刻度为0的数字才是整数
天平是一个刻度
非负整数。刻度为0表示该数字为零
整数
[……]
无论何时将精确或近似的数值指定给
表示精确数值的数据项或参数
其值的近似值,该值保持领先的显著优势-
其舍入或截断后的值在数据类型中表示
目标的目标。将该值转换为具有精度和
目标的规模。是否截断或舍入的选择是不确定的
实现定义
[……]
无论何时将精确或近似的数值指定给
表示近似数值的数据项或参数,
其值的近似值表示为的数据类型
目标。该值将被转换为具有
目标
假设有一个VARCHAR(50)
列,该列将返回VARCHAR(3)
类型,其中存储的字符串仅包含3个字符。这不是很奇怪吗
上面的示例是有效的,因为如果我们将值123.00
修剪为123
,它将不再是有效的数值(5,2)
数据类型。转换已经到位,允许您插入该值而不会引发错误
此外,在这种特殊情况下,您的2005.07.11
中较旧版本的HSQL 1.8.0.1
显然没有遵循SQL标准。从他们的网站上可以看到:
HyperSQL 2支持SQL标准92、1999、2003、2008和2011定义的SQL方言。这意味着如果支持标准的某个功能,例如左外连接,则语法为标准文本指定的语法。支持SQL-92的几乎所有高级语法功能,以及SQL:2011核心和本标准的许多可选功能
将
123
插入数值(5,2)
列时,正确的值应为123.00
。这是正确的,因为对于数值,值总是转换为具有目标数据类型的精度。在您的情况下,指定的精度为5,刻度为2。只有刻度为0的数字才是整数
天平是一个刻度
非负整数。刻度为0表示该数字为零
整数
[……]
无论何时将精确或近似的数值指定给
表示精确数值的数据项或参数
其值的近似值,该值保持领先的显著优势-
其舍入或截断后的值在数据类型中表示
目标的目标。将该值转换为具有精度和
目标的规模。是否截断或舍入的选择是不确定的
实现定义
[……]
无论何时将精确或近似的数值指定给
表示近似数值的数据项或参数,
其值的近似值表示为的数据类型
目标。该值将被转换为具有
目标
假设有一个VARCHAR(50)
列,该列将返回VARCHAR(3)
类型,其中存储的字符串仅包含3个字符。这不是很奇怪吗
上面的示例是有效的,因为如果我们将值123.00
修剪为123
,它将不再是有效的数值(5,2)
数据类型。转换已经到位,允许您插入该值而不会引发错误
此外,在这种特殊情况下,您的2005.07.11
中较旧版本的HSQL 1.8.0.1
显然没有遵循SQL标准。从他们的网站上可以看到:
HyperSQL 2支持SQL标准92、1999、2003、2008和2011定义的SQL方言。这意味着如果支持标准的某个功能,例如左外连接,则语法为标准文本指定的语法。支持SQL-92的几乎所有高级语法功能,以及SQL:2011核心和本标准的许多可选功能
根据标准SQL,响应是正确的,定义为
数值(5,2)
的列应始终返回两个小数位数。@dnoet您是否碰巧对此有引用?根据标准SQL,定义为数值(5,2)
的列应始终返回两个小数位数。@dnoet