zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

 Kettle 数据同步 Caused by: com.microsoft.sqlserver.jdbc.SQLServerException

SQLServer同步数据JDBC by com Microsoft kettle
2023-09-11 14:22:11 时间

场景

使用 Kettle 将 数据从 MySQL同步到 SQLSErver , 其中有一个字段默认为空串,而且确实也没有数据,同步数据报错。

报错如下:

不能将值 NULL 列 'dataType',表 'test1.student';列不允许有 Null 值。INSERT 失败。
 
     at org.pentaho.di.core.database.Database.insertRow(Database.java:1319)
     at org.pentaho.di.core.database.Database.insertRow(Database.java:1243)
     at org.pentaho.di.core.database.Database.insertRow(Database.java:1231)
     at org.pentaho.di.core.database.Database.insertRow(Database.java:1219)
     at org.pentaho.di.trans.steps.insertupdate.InsertUpdate.lookupValues(InsertUpdate.java:114)
     at org.pentaho.di.trans.steps.insertupdate.InsertUpdate.processRow(InsertUpdate.java:299)
     at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
     at java.lang.Thread.run(Thread.java:748)
 Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 不能将值 NULL 列 'dataType',表 'xxxxxxx'

刚开始我认为 难道真的是 null, 于是 我使用了 count(*)进行对应字段的统计, 统计有值,那肯定不是null,默认就是空串,而且表中此字段为  组合主键中的字段就是 not null。

网上查到找到了原因:https://www.cnblogs.com/jingbf-BI/p/4939196.html 

按道理说,这个过程是没有空值的。因为源表字段设置都是not null,并且有默认值。

引起这个问题的原因是,Kettle的作者是Oracle程序员。他引用的是Oracle的处理规则,结果MySQL数据库肯定悲剧了。
不过已经有了一个补救的措施。
在C:\Users\用户名\.kettle目录中找到kettle.properties文件,增加

KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y

重启Kettle即可,果然真的把问题解决了,遇到此问题也是在模拟线上的环境,设置报不上数据就默认为空串,。