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 是一个平面文件,因此它可能将所有内容存储为没有分隔符的文本,但文件大小有分隔符。
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'
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 是一个平面文件,因此它可能将所有内容存储为没有分隔符的文本,但文件大小有分隔符。
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'