Java MySQL不正确的日期值:null

Java MySQL不正确的日期值:null,java,mysql,Java,Mysql,我正在尝试从Java应用程序更新一个表,其中某个列可能为NULL。我尝试了几种不同的方法,但总是出现以下错误: com.mysql.jdbc.MysqlDataTruncation:数据截断:第1行“scheidingsdatam”列的日期值不正确:“null” 我确保该表允许scheidingsdatum字段为空值,并且在直接插入MySQL时可以插入空值 这是PHPMyAdmin中的表结构: 这些表使用innoDB 我尝试了以下解决方案: 1:只需在参数中使用NULL变量 stmnt = c

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

com.mysql.jdbc.MysqlDataTruncation:数据截断:第1行“scheidingsdatam”列的日期值不正确:“null”

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

这是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块内)

3:使用setNull(4,java.sql.Types.DATE)

4:使用setNull(4,java.sql.Types.NULL)

以下是我的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"));

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

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

您可以在准备好的语句中尝试使用时间戳而不是日期

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

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

这是有史以来最愚蠢的修复

代码最初是由其他人编写的,我只是对其进行了一点扩展。他们首先创建了一个字符串
scheidingsdatam=“null”,如果有实际日期,则会被实际日期覆盖

我假设(我知道,假设它是不明智的)当它没有值时它将是空的(注意缺少引号?)

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


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

@YassinHajaj null是一个特殊值,SQL是一种三值逻辑语言。OP需要NULL,而不是它的替换。如果使用替换,您需要记住这一点,并相应地修改所有查询。@YassinHajaj任何日期理论上都是可能的。@dognose适用于插入,但是更新它怎么样?稍后应该可以将其从实际日期更改为null。奇怪的是,如果您确实看到了这个问题,那么可能是JDBC驱动程序有问题。我无法想象你的方法中至少有一种是行不通的。看这个。似乎有关联。。。但是没有用。但是,它不会和更新之前一样吗?Scheidingsdatum可以在设置后为空。啊,好的观点。然后,在scheidingsdatum应该保存为null的情况下,将“scheidingsdatum=?”替换为“scheidingsdatum=null”。不幸的是,当我这样做时,仍然会得到相同的异常:(正如我在这里解释的,这确实是问题所在
Class.forName(props.getProperty("jdbc.drivers")).newInstance();
this.conn = (Connection) DriverManager.getConnection(props.getProperty("jdbc.url"),props.getProperty("jdbc.username"),props.getProperty("jdbc.password"));
UPDATE gezinnen SET ouder1 = ?, ouder2 = ?, huwelijksdatum = ?
WHERE gezinsNummer = ?
stmnt.setNull(4, java.sql.Types.TIMESTAMP);