【问题标题】:MySQL JDBC driver & FLOAT(N, M) column typeMySQL JDBC 驱动 & FLOAT(N, M) 列类型
【发布时间】:2011-04-16 21:13:35
【问题描述】:

我最近遇到了一个对我来说有点奇怪的错误。假设我们有一个包含 FLOAT(8, 3) 列的表。让我们也考虑一下我们有一个可通过网络浏览器访问的经过验证的表格编辑器。表格编辑器支持对每一列进行客户端验证,并且不允许使用简单的 JavaScript 正则表达式放置不在列类型指定范围内的浮点数,例如:

var rx = new RegExp("^\\d{1," + (total - precision) + "}(\\.\\d{1," + precision + "})?$");

简单表示:

^\d{1,5}(\.\d{1,3})?$

对于 FLOAT(8, 3)。用户可以轻松地将 99999.999 输入到该单元格中,当他保存更改时,他会在单元格中获得 100000 - 一个精度丢失值,对于表列约束无效。我尝试扩展验证器正则表达式以传递 100000,但此值 无法 保存到数据库中。哇...这是预料之中的,因为 “第 N 行的列 'COLUMN' 的值超出范围”,但我没想到 MySQL 控制台(不显示警告)和 SQLyog(显示警告)将允许以下UPDATE 查询:

UPDATE TABLE SET COLUMN = 100000; /* No matter it's out of range for FLOAT(8, 3), it's trimmed but not via JDBC MySQL driver*/

显然这是 MySQL 连接器特定的问题。是否是 MySQL 连接器的错误(目前我使用mysql-connector-java-5.1.12-bin.jar)?或者是否有任何快速的解决方法允许通过 JDBC 驱动程序修剪或调整 100000(理想情况下是最大值)?

提前致谢。

【问题讨论】:

    标签: java mysql jdbc mysql-connector


    【解决方案1】:

    听起来你被四舍五入烧焦了。

    如果将表格列设为 9,3 或 10,3 而不是 8,3,会发生什么情况?不要更改验证码,只更改列定义。

    您可以使用带有假定小数点的整数列吗?也就是说,1 将存储为 1000。3.221 将存储为 3221。在显示数字之前,您必须知道除以 1000。

    这里是关于problems with MySQL Float的讨论。

    【讨论】:

    • 感谢您的回复。是的,这正是一个四舍五入的问题。不幸的是,我目前无法更改表定义,但我确信在这种情况下会传递 100000,因为它在 FLOAT(9,3) 范围内。此外,我无法将列类型更改为整数,尤其是假设小数点位置。我现在建议解决该问题的最佳方法是以某种方式更改 MySQL JDBC 驱动程序行为,使其像 MySQL 控制台使用的驱动程序一样处理查询。而且我不知道怎么...
    • 好的,你能添加一个类型更友好的新列,从第一列填充它,并有时使用新列吗?风险更大,但可能比更换驱动程序风险更小。或者,您能否确定是否有一小部分值行为不正确并破解您的 DAO 以在这些情况下返回正确的值?我确信 MySQL 人员有(非免费)支持服务。也许他们可以提供帮助。
    • 我对黑客有同样的想法,但它们仍然是黑客,可能需要更多时间来实施和执行,因为我应该始终注意从数据库中获取正确的 N 和 M 值,因为我们在那里使用各种 FLOAT(N, M)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2016-03-27
    • 2015-01-11
    • 2010-12-08
    • 2014-10-24
    相关资源
    最近更新 更多