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

Kha*_*dez 10 java mysql database

我正在使用java和MySQL.我试图在表中插入一个值.

当我插入时,我得到这个例外:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of 
range value for column 'idPxxx' at row 1
Run Code Online (Sandbox Code Playgroud)

只有5%的插入产生此异常,其他插件则有效.错误是什么意思,我该如何预防呢?

Ari*_*iel 14

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

什么是数据类型idPxxx?你想把它储存在哪里?

  • @Khaledez 你怎么不回答我在回答中提出的问题? (2认同)
  • @Khaledez 作为实验,尝试将数据类型更改为已签名,然后尝试加载。也许你有一些负数却不知道?另一种可能性是 java 连接器没有正确处理 64 位数字,因此它将它们截断为 32 位,这可以将它们变成负数,并且由于列被列为无符号而失败。 (2认同)

Eri*_*ski 6

如何在 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)
Run Code Online (Sandbox Code Playgroud)

您尝试将 1234 塞入可能占用 max 的列中9.99999999,因为DECIMAL(9, 8)总共 9 位数字,其中 8 位是小数点后的数字。请注意,该行仍然被插入。

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

插入命令尝试添加第二行失败penguin

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

解决方案

  1. 扩展列中数据类型的大小以接受您在其中输入的值。
  2. 缩小您试图填充到小数据类型中的值的大小。