CommonRdbmsWriter 类里
fillPreparedStatementColumnType方法里
?
String str = column.asString();
if (DataBaseType.PostgreSQL.compareTo(dataBaseType)==0&&StringUtils.isNotEmpty(str)&&str.indexOf('\u0000')>-1){
//如果writer是postgresql 并且字段类型是text vachar 然后值value!=null 同时含有这个特殊字符
str = str.replace('\u0000',' ').replace(" ","");
}
if (DataBaseType.Oracle.compareTo(dataBaseType)==0){
if (columnSqltype==Types.VARCHAR&&str!=null&&str.getBytes(StandardCharsets.UTF_8).length>=4000){
//全中文3000字 9000 字节 -> 1333字符 4000字节
//全英文5000字 5000字节 -> 4000字符 4000字节
//中文1500 英文1000 字节5500 -> 2000(中1500英500) 5000字符 -> 1333字符
str = str.substring(0, Math.min(str.length(), 4000));
if (str.getBytes(StandardCharsets.UTF_8).length>=4000){
str = str.substring(0, 1333); //直接认为全是中文
}
}
if (columnSqltype==Types.NVARCHAR&&str!=null&&str.length()>=2000){
//2000中文 2000英文
if (str.getBytes(StandardCharsets.UTF_8).length>2000){
//有中文
str = str.substring(0, 1333);
}else { //有中英文
str= str.substring(0, 1500 );
}
}
}
preparedStatement.setString(columnIndex + 1, str);
break;
说下优化点
1.优化输出到postgresql里时候 有个特殊字符\u0000 在插入的时候会报错直接替换为无了。这个不会影响结果,因为这个字符本身大多时候就没有意义
2.优化oraclewriter时,由于hive的string是不限长度的,但是oracle的varhcar2最长是4000字节,1333汉字,nvarchar2000是2000字符。
但是在insert into? oracle_table values ("2000个汉字的时候") 会报一个下面的错 【仅能绑定要插入的LONG列的LONG值的错】
在insert into? oracle_table values ("1500个汉字的时候") 不会报错....
但是在直接向表里粘贴2000汉字时候,不会报错
有熟悉这块的可以自行更改。。这个改动的目的是保证所有数据都插入到oracle即使部分数据残缺。
?
?
|