PreparedStatement是否将空字符串转换为null?

3

我正在使用MySQL和他们最新的JDBC驱动程序,处理一个名为User的表格,其中所有字段都有NOT NULL约束条件,这些字段是idnamepasswordemail

在我的Java EE应用程序中,我首先以如下方式调用简单的Statement

statement = connection.createStatement();
statement.executeUpdate( "INSERT INTO User (name, password, email) "
         + "VALUES ('" + paramName + "', '" + paramPassword + "', '" + paramEmail + "');" );

paramNameparamPasswordparamEmail 为字符串时,我向此请求传递了空字符串,并成功地将一行空值插入表中。因为 MySQL 认为空字符串与空条目不同。

然后,我使用了一个 PreparedStatement

preparedStatement = connection.prepareStatement( "INSERT INTO User (name, password, email) VALUES(?, ?, ?);" );
preparedStatement.setString( 1, paramName );
preparedStatement.setString( 2, paramPassword );
preparedStatement.setString( 3, paramEmail );
preparedStatement.executeUpdate();

当我将空字符串传递给请求时,这次出现了以下错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 列'name'不能为空
所以我的问题是: PreparedStatement 或者它的 setString() 方法是否会将空字符串转换为 null 值?我查阅了Javadoc并没有找到有关此行为的信息。

我在我的系统中也看到了这种行为。 - Bruno Negrão Zica
2个回答

2

在方法setString中,java.sql.PreparedStatatement的文档没有提到这一点。我查看了MySQL ConnectorJ的源代码,也没有发现什么。你确定你的字符串不是null吗?


好的,我明白了我的错误,字符串确实是空的。我天真地认为它们不是空的,因为经典的“语句”在表中插入了空值,但这只是因为我通过连接直接构建了我的请求。 - Med

2
答案是。请确保您的参数值不为空。也许您的变量paramNameNULL

这是错误的。检查JDBC代码(OraclePreparedStatement#setStringInternal),可以清楚地看到如果长度为0,则该值将设置为null。 - ocarlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接