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
设置为" "
(一个空格),然后在项目中修剪每个值,因为它将被修剪为" "
,所以您将永远无法拥有""
。