簡體   English   中英

com.mysql.jdbc.MysqlDataTruncation:數據截斷:列“column_name”的數據太長

[英]com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'column_name'

我將 Java JDBC 與 MySQL 一起使用,但出現此錯誤:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: 
Data too long for column 'column_name'

我該如何糾正這個錯誤?

當我打算將圖像文件作為字節插入數據庫中時,我在 Spring Boot Data JPA 應用程序中遇到了同樣的問題——它給了我同樣的錯誤。

經過多次研發,我找到了如下解決方案。


我在application.properties文件中添加了以下行,它解決了這個問題:

spring.datasource.url=jdbc:mysql://localhost:3306/conweb?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false

希望它對某人有所幫助。

如何在 MySQL 終端中重現此錯誤

mysql> create table penguins(val CHAR(2));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into penguins values("AB");
Query OK, 1 row affected (0.00 sec)

mysql> insert into penguins values("ABC");
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'val' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

這是您遇到的錯誤,但是在 MySQL 終端中將其顯示為警告並仍然插入您的行,只是默默地截斷它。

MySQL JDBC 沒有那么寬容,並且會吐出一個硬錯誤並且不會插入該行。


2 解決方案

要么增加您要插入的數據類型的容量,要么減少您放入其中的內容的大小

增加列大小的圖例:

If you are using   then use this
-----------------  --------------
smallint           int
int                long
TEXT               LONGTEXT
LONGTEXT           CLOB
CLOB               Store the content to disk, and save the filename in the db.

這似乎很明顯,而且確實如此。 您顯然試圖插入或更新行,其“column_name”列的值大於該列的值。

例如,如果它是 CHAR 或 VARCHAR,則您的字符串可能比定義的列大小長。

您修復此問題的選擇也有些明顯 - 要么確保您存儲的數據不大於列(可能通過在存儲它們之前截斷更長的字符串),或者增加數據庫列的大小。

在上傳 Image/Word/PDF 文件時,我在 Spring Boot 應用程序中遇到了同樣的問題,並通過以下步驟修復了它:

解決方案

  1. 請查看您嘗試上傳的文件的大小。
  2. 然后將該文件大小與映射的數據庫字段類型允許的最大大小進行比較。
  3. 例如對於 LOB:
    TINYBLOB ≈ 255 字節,BLOB ≈ 64KB,MEDIUMBLOB ≈ 16MB 和 LONGBLOB ≈ 4GB 運行
  4. 根據您的空間要求使用 Alter table 命令:

    ALTER TABLE 'TABLE_NAME' 修改 'FIELD_NAME' MEDIUMBLOB;

    注意:始終建議在數據庫中保存鏈接而不是實際文件(具有大尺寸)。

在我的情況下,上傳的數據包含引號('和“)。這就是為什么我得到你上面提到的同樣的異常。刪除數據中的引號后成功插入到表中。

出現此錯誤是因為您嘗試插入列的數據大小太大。

解決方案 - 將列大小更改為最大。假設您的列是 VARCHAR 類型,然后在 mySQL

ALTER TABLE table_name CHANGE COLUMN col_name col_name  VARCHAR(1000);  //assuming 1000 is enough

我建議你使用 Spring Boot 和 Hibernate。 我遇到了同樣的問題,解決方案非常明顯:

    @Column(length = 65555)
    @NotNull
    private String content;

我也嘗試了以下行,但這不知何故沒有顯示出任何效果:

@Size(min = 5, max = 65555)

我認為這可能會發生,因為 MySQL 表大小有默認約束,如果輸入的值不在定義的范圍內, @Size注釋僅用於向用戶反饋。 我希望這可以解決您的問題!

對於那些偶然發現這里的人來說,類似錯誤可能還有另一個原因:

存儲過程參數的類型可能是一個限制因素。

例如:您有相應的列數據類型,並且將數據作為 LONGTEXT 發送到 MySQL 服務器,而您發送 LONGTEXT 數據的存儲過程的參數可能具有 TEXT 類型。 在這種情況下,您需要更新參數數據類型

在 JPA 實體中,使用帶有長度的注釋 @Column。 那應該可以解決問題。

示例代碼:

@Entity
public class SampleEntity{

    @Column(length = 1200)
    private String column_name;

    // ...

}

根據您的喜好設置長度,它將在表中變為VARCHAR(length) 如果您提供更大的值,它將被創建為longtext

久經考驗 - 創建 sql 腳本顯示如下:

CREATE TABLE `SampleEntity` (
  `id` bigint(20) NOT NULL,
  `dateCreated` datetime DEFAULT NULL,
  `dateModified` datetime DEFAULT NULL,
  `column_name` longtext,
  `userName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

參考 - https://www.baeldung.com/jpa-size-length-column-differences

在我們的例子中,只需重新啟動應用程序即可解決問題,重新啟動是指重新啟動 tomcat。 任何想法是否可能由於其他原因而發生此問題,但會像這樣拋出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM