Java MysqlDataTruncation:数据截断:列';的值超出范围;列';在第一排
我正在使用java和MySQL。我试图在表中插入一个值 插入时,会出现以下异常:Java MysqlDataTruncation:数据截断:列';的值超出范围;列';在第一排,java,mysql,database,Java,Mysql,Database,我正在使用java和MySQL。我试图在表中插入一个值 插入时,会出现以下异常: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'idPxxx' at row 1 只有5%的插入会产生此异常,其他插入会产生此异常。错误是什么意思?我如何防止它?它意味着您存储在idPxxx中的数据不适合。例如,字符串可能太长,或者数字太大 idPxxx的数据类型是什么?您试图在其中存储什么?
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of
range value for column 'idPxxx' at row 1
只有5%的插入会产生此异常,其他插入会产生此异常。错误是什么意思?我如何防止它?它意味着您存储在
idPxxx
中的数据不适合。例如,字符串可能太长,或者数字太大
idPxxx
的数据类型是什么?您试图在其中存储什么?如何在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)
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
您试图将1234填充到一个最多可重复9.9次的列中。请注意,该行仍处于插入状态
您可以使用严格模式获取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)
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
insert命令尝试向企鹅添加第二行失败:
mysql> select * from penguin;
+------------+
| mydecimal |
+------------+
| 9.99999999 |
+------------+
1 row in set (0.00 sec)
解决方案
对我来说,问题是未签名的数据类型,删除该标志解决了我的问题 这种类型的错误消息可以针对不同的场景显示 我找到了一个原因: 在我的例子中,我定义了 双(17,17) 。。。这意味着17位和17位小数,因此整数(!)的值为0 与 双人(24,12)
一切正常谢谢你,这是我的想法,但这个问题只发生在发送的数据的5%上,当我重复测试时,同样的情况也会发生。@Khaledez为什么你没有回答我在回答中提出的问题?数据类型是
Unsigned INT(64)
,我正在尝试插入值2000
。我再次插入到X
表中,该表具有来自Y
表的外键idPxxx
,并且idPxxx
的值存在于Y
表中。@Khaledez作为一个实验,尝试将数据类型更改为signed,然后尝试加载。也许你有负数却不知道?另一种可能是java连接器没有正确处理64位数字,因此它将它们截断为32位,这会使它们变为负数,并且由于列被列为未签名列,因此会失败。谢谢,我发现问题是由另一个问题引起的,该问题将idPxxx
的值设置为-2,在我将数据类型更改为有符号后查看此问题,可能DB中有一种类型,而插入的数据是另一种类型。我也使用了无符号数据类型,并传递负值,这是由于此错误而捕获的。