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
表的外键idPxxx
,idPxxx
的值存在于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:...