1

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

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

简单地表示:

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

对于浮点数(8, 3)。用户可以轻松地将 99999.999 输入到该单元格中,当他保存更改时,他会在单元格中获得 100000 - 一个精度丢失值,对于表列约束无效。我尝试扩展验证器正则表达式以传递 100000,但该值无法保存到数据库中。哇...这是预期的,因为"Out of range value for column 'COLUMN' at row N",但我没想到 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)吗?或者是否有任何快速解决方法允许将 100000(理想情况下是最大值)由 JDBC 驱动程序修剪或调整?

提前致谢。

4

1 回答 1

1

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

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

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

这里是关于MySQL Float 问题的讨论。

于 2010-09-24T20:23:12.900 回答