MySQL Неверное значение даты: null

Я пытаюсь обновить таблицу из приложения Java, где определенный столбец может быть NULL. Я пробовал несколько разных подходов, но всегда получаю следующую ошибку:

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

Я убедился, что таблица допустила значения NULL для поля scheidingsdatum и может вставлять значения NULL при прямой вставке в MySQL

Это структура таблицы в PHPMyAdmin:

Структура таблицы PHPMyAdmin

В таблицах используется innoDB

Я пробовал следующие решения:

1: просто используйте переменную NULL в параметре

stmnt = conn.prepareStatement("UPDATE gezinnen SET "
                            + "ouder1 = ?," 
                            + "ouder2 = ?," 
                            + "huwelijksdatum = ?,"
                            + "scheidingsdatum = ? "
                            + "WHERE gezinsNummer = ?");

stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setString(4, scheidingsdatum);
stmnt.setString(5, nummer);

2: Жесткий код NULL в запросе (внутри блока if/else)

stmnt = conn.prepareStatement("UPDATE gezinnen SET "
                            + "ouder1 = ?," 
                            + "ouder2 = ?," 
                            + "huwelijksdatum = ?,"
                            + "scheidingsdatum = NULL "
                            + "WHERE gezinsNummer = ?");

stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setString(4, nummer);

3: Используйте setNull (4, java.sql.Types.DATE)

stmnt = conn.prepareStatement("UPDATE gezinnen SET "
                            + "ouder1 = ?," 
                            + "ouder2 = ?," 
                            + "huwelijksdatum = ?,"
                            + "scheidingsdatum = ? "
                            + "WHERE gezinsNummer = ?");

stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setNull(4, java.sql.Types.DATE);
stmnt.setString(5, nummer);

4: Используйте setNull (4, java.sql.Types.NULL)

stmnt = conn.prepareStatement("UPDATE gezinnen SET "
                            + "ouder1 = ?," 
                            + "ouder2 = ?," 
                            + "huwelijksdatum = ?,"
                            + "scheidingsdatum = ? "
                            + "WHERE gezinsNummer = ?");

stmnt.setString(1, ouder1);
stmnt.setString(2, ouder2);
stmnt.setString(3, huwelijksdatum);
stmnt.setNull(4, java.sql.Types.NULL);
stmnt.setString(5, nummer);

следующим образом создается файл database.properties и создание соединения:

database.properties

jdbc.drivers=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://IP:3306/TABLE_NAME
jdbc.username=USER
jdbc.password=PASSWORD

Создание соединения

Class.forName(props.getProperty("jdbc.drivers")).newInstance();
this.conn = (Connection) DriverManager.getConnection(props.getProperty("jdbc.url"),props.getProperty("jdbc.username"),props.getProperty("jdbc.password"));

Ответ 1

Я только что сделал тест, и он работал у меня с stmnt.setNull(4, java.sql.Types.Date);, вы уверены, что для stmnt.setString(3, huwelijksdatum); значение huwelijksdatum является допустимой строкой даты mysql, а не "null"?

Ответ 2

Ну, это самое тупое исправление.

Код изначально был сделан кем-то другим, и я немного расширил его. Сначала они создали строку scheidingsDatum = "null";, которая затем была бы перезаписана фактической датой, если таковая была.

Я предположил (я знаю, что это не разумно предположить), что это будет null (обратите внимание на отсутствие кавычек?), когда у него не было значения.

Итак, в моей проверке строка не была нулевой (так как она была "null" ), и поэтому первая часть была выполнена. Это заставило его попытаться вставить строку "null" , что, очевидно, является неправильной датой.

Просто модификация строки, которая должна быть нулевой, вместо "null" при создании экземпляра исправила проблему.

Ответ 3

Вы можете попробовать TIMESTAMP вместо DATE в вашем подготовленном заявлении.

stmnt.setNull(4, java.sql.Types.TIMESTAMP);

Ответ 4

Если scheidingsdatum является полем с нулевым значением, просто удалите его из оператора UPDATE, когда его значение равно null. Другими словами, когда scheidingsdatum имеет значение null, измените оператор на:

UPDATE gezinnen SET ouder1 = ?, ouder2 = ?, huwelijksdatum = ?
WHERE gezinsNummer = ?