MySQL日期值不正确:null

时间:2015-10-19 20:49:40

标签: java mysql

我尝试从某个列可能为NULL的Java应用程序更新表。我尝试了几种不同的方法,但我总是得到以下错误:

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

我确保表允许scheidingsdatum字段的NULL值,并且可以在直接插入MySQL时插入NULL值

这是PHPMyAdmin中的表结构:

PHPMyAdmin table structure

表格使用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"));

4 个答案:

答案 0 :(得分:4)

我刚做了一个测试,它对stmnt.setNull(4, java.sql.Types.Date);有用,你确定stmnt.setString(3, huwelijksdatum); huwelijksdatum的值是一个有效的mysql日期字符串而不是“null”吗?

答案 1 :(得分:3)

嗯,这是有史以来最蠢的修理。

代码最初是由其他人制作的,我只是稍微扩展了一下。他们首先创建了一个字符串scheidingsDatum = "null";,如果有的话,它将被实际日期覆盖。

假设(我知道,从来没有聪明的假设)当它没有值时它会为空(注意缺少引号?)。

所以,在我的检查中,字符串不是null(因为它是“null”),所以第一部分被执行了。这使得它试图插入一个字符串“null”,这显然是一个不正确的日期。

在实例化时,只需将字符串修改为null而不是“null”就可以解决问题。

答案 2 :(得分:2)

您可以在准备好的语句中尝试TIMESTAMP而不是DATE。

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

答案 3 :(得分:0)

如果scheidingsdatum是一个可以为空的字段,那么只要它的值为null,就将其从UPDATE语句中删除。换句话说,当scheidingsdatum为null时,将语句更改为:

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