[英]com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for 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> 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 沒有那么寬容,並且會吐出一個硬錯誤並且不會插入該行。
要么增加您要插入的數據類型的容量,要么減少您放入其中的內容的大小。
增加列大小的圖例:
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 應用程序中遇到了同樣的問題,並通過以下步驟修復了它:
解決方案
根據您的空間要求使用 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.