Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于插入的123,数字(5,2)是否应返回123或123.00?_Java_Sql_Jdbc_Hsqldb_Bigdecimal - Fatal编程技术网

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