PreparedStatement setString取“ null”(就像String a = "null"一样),并在.addBatch之后将其转换为正常的null(就像String a = null一样)。

我不知道如何能够绕开这种误解,因为很多行都作为批处理添加后立即执行了很多行(sql语句是INSERT INTO ...)(VarChar不能null,但如果String a = "null"可以不接受批处理而被表接受,则整个程序由于来自服务器的错误msg而停止)

错误信息 :
将数据写入数据库时​​出错... 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。原因很简单,外部表是一个平面文件,因此它可能将所有内容存储为TEXT(不带分隔符),但文件大小是定界的。

Handle the absence of a value


  在SQL中,如果列被声明为非null,则记录必须包含一个值。当记录不包含任何列的值时,该列被视为空。该系统提供了一种显式和隐式的方法来传达无效性。
  -显式方法在字段中包含特定标记而不是值。默认情况下,此标记是单词“ null”(不区分大小写)。您可以使用nullValue选项将此令牌更改为任何其他1-4个字符的字母令牌。您可以在带有相邻空格的非字符串字段中出现显式null标记之前或之后。为了使系统能够识别字符串字段中的显式空标记,标记不能具有前面或后面的相邻空格。显式的null令牌方法使无法表示完全由null令牌的文本组成的字符串。


然后,我们可以在The NullValue option中看到相同的想法


  指定用于空值的字符串,最大为4字节的UTF-8字符串。默认值为“ NULL”。


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

因此,我的解决方案是将表的NullValue设置为" "(一个空格),然后在项目中修剪每个值,因为它将被修剪为" ",所以您将永远无法拥有""

10-01 20:15
查看更多