MysqlDataTruncation:数据截断:第 1 行列“列”的值超出范围

Posted

技术标签:

【中文标题】MysqlDataTruncation:数据截断:第 1 行列“列”的值超出范围【英文标题】:MysqlDataTruncation: Data truncation: Out of range value for column 'column' at row 1 【发布时间】:2011-12-31 04:36:23 【问题描述】:

我正在使用 java 和 mysql。我正在尝试向表中插入一个值。

当我插入时,我得到了这个异常:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of 
range value for column 'idPxxx' at row 1

只有 5% 的插入会产生这个异常,其他的会起作用。错误是什么意思,我该如何预防?

【问题讨论】:

看到这个问题***.com/questions/73109/mysql-data-truncation-error 也许你在数据库中有一种类型,而插入的数据是另一种类型。 【参考方案1】:

这意味着您存储在idPxxx 中的数据不适合。例如,字符串可能太长,或者数字太大。

idPxxx 的数据类型是什么?您想在其中存储什么?

【讨论】:

谢谢,我就是这么想的,但这个问题只发生在发送的数据的 5% 上,当我重复测试时也会发生同样的情况。 @Khaledez 你为什么没有回答我在回答中提出的问题? 数据类型为Unsigned INT(64),我正在尝试插入值2000。我再次插入到X 表中,该表具有来自Y 表的外键idPxxxidPxxx 的值存在于Y 表中。 @Khaledez 作为实验,尝试将数据类型更改为有符号,然后尝试加载。也许你有一些负数但不知道?另一种可能性是 java 连接器没有正确处理 64 位数字,因此它会将它们截断为 32 位,这可能会使它们变为负数,并且由于列被列为无符号而反过来又失败了。 谢谢,我发现这个问题是由另一个问题引起的 【参考方案2】:

如何在 MySQL 控制台上产生这个异常:

mysql> create table penguin (mydecimal decimal(9,8));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into penguin values (1234.1234);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+----------------------------------------------------+
| Level   | Code | Message                                            |
+---------+------+----------------------------------------------------+
| Warning | 1264 | Out of range value for column 'mydecimal' at row 1 |
+---------+------+----------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from penguin;
+------------+
| mydecimal  |
+------------+
| 9.99999999 |
+------------+
1 row in set (0.00 sec)

您试图将 1234 塞入一个最多可重复 9.9 次的列中。请注意,该行仍被插入。

您可以让 MySQL 控制台使用严格模式来阻止这种转换:

mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into penguin values (5678.5678);
ERROR 1264 (22003): Out of range value for column 'mydecimal' at row 1

插入命令尝试向企鹅添加第二行失败:

mysql> select * from penguin;
+------------+
| mydecimal  |
+------------+
| 9.99999999 |
+------------+
1 row in set (0.00 sec)

解决方案

    扩展列中数据类型的大小以接受您输入的值。 将您尝试塞入小数据类型的值的大小缩小。

【讨论】:

【参考方案3】:

对我来说问题是无符号数据类型,删除标志已经解决了我的问题。

【讨论】:

我也使用了无符号数据类型,并且传递了负值,因为这个错误而被捕获。【参考方案4】:

这种类型的错误信息可以针对不同的场景显示。

我找到了一个原因:

在我的情况下,我已经定义了问题

双 (17,17)

...这意味着 17 位数字和 17 位小数,因此整数 (!) 为 0。

双(24,12)

一切正常

【讨论】:

以上是关于MysqlDataTruncation:数据截断:第 1 行列“列”的值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

SERIALIZED CONTEXT 数据截断问题 [SPRING BATCH]

mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...

com.mysql.jdbc.MysqlDataTruncation: Data truncation异常

com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value:...

Caused by com mysql jdbc MysqlDataTruncation Data truncati