【问题标题】:Does PreparedStatement convert empty strings to null?PreparedStatement 是否将空字符串转换为 null?
【发布时间】:2012-07-16 02:57:06
【问题描述】:

我正在使用 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:列“名称”不能为空

这是我的问题PreparedStatement 或者它的setString() 方法是否将空字符串转换为空值?我查了一下,并没有在 javadoc 中找到有关此行为的任何信息。

【问题讨论】:

  • 我在我的系统中也看到了这种行为。

标签: mysql jdbc prepared-statement string


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    java.sql.PreparedStatatement 的文档在方法 setString 中没有说明任何内容。我查看了 MySQL ConnectorJ 的来源,也没有找到任何东西。你确定你的 String 不为空吗?

    【讨论】:

    • 好的,我理解我的错误,字符串确实为空。我天真地以为他们不是因为经典的Statement 在表中插入了空值,但这只是因为我直接通过串联构建了我的请求。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多