场景:
使用 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:///jingbf-BI/p/4939196.html
按道理说,这个过程是没有空值的。因为源表字段设置都是not null,并且有默认值。
引起这个问题的原因是,Kettle的作者是Oracle程序员。他引用的是Oracle的处理规则,结果MySQL数据库肯定悲剧了。
不过已经有了一个补救的措施。
在C:\Users\用户名\.kettle目录中找到kettle.properties文件,增加
KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y
重启Kettle即可,果然真的把问题解决了,遇到此问题也是在模拟线上的环境,设置报不上数据就默认为空串,。