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 ('') → 報錯
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();
if (TextUtils.isEmpty(birthday)) {
// 提示用戶必填,或設置默認值
birthday = "1970-01-01";
}
ALTER TABLE student MODIFY birthday DATE DEFAULT '1970-01-01';
但應用層仍應顯式處理,避免業務語義混淆。
System.out.println(ps.toString()) (需驅動支持) 或攔截器記錄。@DateTimeFormat(pattern="yyyy-MM-dd")、@JsonFormat 等註解是否導致空字符串綁定。SELECT @@sql_mode; 若包含 NO_ZERO_IN_DATE, STRICT_TRANS_TABLES 會拒絕空值/零日期。Incorrect date value: '' 直接指向 日期字段被綁定為空字符串。修復核心:參數化查詢 + 顯式空值轉 NULL。杜絕字符串拼接 SQL,從源頭消除注入與類型轉換風險。