首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL Data Truncation: Incorrect date value 為空字符串導致插入失敗

     編輯:程式設計疑難解答

錯誤堆棧

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: '' for column 'birthday' at row 1

原因定位

value: '' 表明 SQL 執行時 birthday 字段接收到的是空字符串,而非 NULL 或合法日期。MySQL 日期類型不接受空字符串 (嚴格模式下)。

常見代碼錯誤


// 錯誤:未判斷輸入為空,直接拼接
String sql = "INSERT INTO student (birthday) VALUES ('" + birthday + "')";
// 若 birthday = "",生成 VALUES ('') → 報錯

解決方案

1. 參數化查詢 + 空值處理(推薦)


String sql = "INSERT INTO student (birthday) VALUES (?)";
PreparedStatement ps = conn.prepareStatement(sql);
if (birthday == null || birthday.trim().isEmpty()) {
    ps.setNull(1, Types.DATE); // 插入 NULL
} else {
    ps.setDate(1, java.sql.Date.valueOf(birthday)); // 格式 yyyy-MM-dd
}
ps.executeUpdate();

2. 應用層校驗


if (TextUtils.isEmpty(birthday)) {
    // 提示用戶必填,或設置默認值
    birthday = "1970-01-01"; 
}

3. 數據庫層面設置默認值


ALTER TABLE student MODIFY birthday DATE DEFAULT '1970-01-01';

但應用層仍應顯式處理,避免業務語義混淆。

調試技巧

  1. 打印最終 SQL:System.out.println(ps.toString()) (需驅動支持) 或攔截器記錄。
  2. 檢查實體類字段:@DateTimeFormat(pattern="yyyy-MM-dd")、@JsonFormat 等註解是否導致空字符串綁定。
  3. MySQL 模式檢查:SELECT @@sql_mode; 若包含 NO_ZERO_IN_DATE, STRICT_TRANS_TABLES 會拒絕空值/零日期。

總結

Incorrect date value: '' 直接指向 日期字段被綁定為空字符串。修復核心:參數化查詢 + 顯式空值轉 NULL。杜絕字符串拼接 SQL,從源頭消除注入與類型轉換風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved