preparedStatement.setString(1,"null"),被解释为 null 而不是字符串(在 preparedStatement.addBatch() 之后)

preparedStatement.setString(1,"null"), is being interpreted as null instead of a string (after preparedStatement.addBatch())

PreparedStatement setString 采用 "null"(如同 String a = "null")并在 .addBatch 之后将其转换为普通 null(如同 String a = null)。

我不知道如何能够绕过这种误解,因为很多行在它们被全部添加为批处理后立即执行......(sql 语句是一个 INSERT INTO ...)(VarChar 不能为 null,但是 String a = "null" 可以被 table 接受,如果它没有批量发送...整个程序由于来自服务器的错误消息而停止)

错误信息: 将数据写入数据库时​​出错...org.netezza.error.NzSQLException:错误:第 17 列:字段不能包含空值

代码:

preparedStatement.setString(17, x); //currently x was recieved as "null"
preparedStatement.addBatch() //after other parameters were filled then this statement
preparedStatement.executeBatch(); //after the logs this statement is executed.

希望有一个快速解决方法

我使用了这个绕过,但认为可能有更好的绕过...(因为我无法更改数据库默认值或操作数据...)

if(helper.toLowerCase().equals("null"))
    helper = (helper.equals("null") ? "null ":"NULL ");

preparedStatement.setString(17, helper);

请记住,我从未使用过 Netezza,因此无法尝试任何东西。这是IBM Netezza 官方文档中的资料集合。

如果我没看错,文本值 "null" 有一个显式转换以识别 external table 值的缺失...原因很简单,外部 table 是一个平面文件,因此它可能将所有内容存储为没有分隔符的文本,但文件大小有分隔符。

Handle the absence of a value

In SQL, a record must include a value if a column is declared as not null. When a record contains no value for a column, the column is considered to be null. The system provides an explicit and implicit method for conveying nullness.
- The explicit method includes a specific token in the field instead of a value. By default, this token is the word “null” (not case-sensitive). You can use the nullValue option to change this token to any other 1 - 4 character alphabetic token. You can precede or follow an occurrence of the explicit null token in a non-string field with adjacent spaces. For the system to recognize an explicit null token in a string field, the token cannot have preceding or trailing adjacent spaces. The explicit null token method makes it impossible to express a string that consists of exactly the text of the null token.

然后,我们可以在The NullValue option

中看到同样的想法

Specifies the string to use for the null value, with a maximum 4-byte UTF-8 string. The default is ‘NULL’.

您可以将此 table 的选项替换为任何其他 String,但我相信这只会解决问题...

所以我的解决方案是,将 table 的 NullValue 设置为 " "(一个 space),在你的项目中 trim 每个值,你将永远无法拥有 " ",因为它会 trimmed 为 ""

考虑到你的问题,我认为你正在尝试插入 String null 除非另有说明。 此问题的最简单解决方案是将列的默认值设置为字符串 null,这样您就不必担心在代码中指定它可能会或可能不会将其解释为空。 即在列定义上添加约束 NOT NULL DEFAULT 'null'