环境信息
JDK 1.8 Canal 1.1.3 ClientAdapter 1.1.3 mysql 5.5
问题描述
使用HBase模式
手动ETL: curl http://127.0.0.1:8081/etl/hbase/user.yml -X POST
抛错:com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: '255' in column '49' is outside valid range for the datatype TINYINT.
column '49' 的类型:recommend tinyint(1) unsigned NOT NULL DEFAULT '0'
recommend 存储数据有3种值0, 1, 255
原因:
调用ClientAdapter类:public class HbaseEtlService 方法:207行 private static boolean executeSqlImport(DataSource ds, String sql, MappingConfig.HbaseMapping hbaseMapping, HbaseTemplate hbaseTemplate, AtomicLong successCount, List errMsg)
执行到251行: Object val = JdbcTypeUtil.getRSData(rs, columnName, jdbcTypes[j - 1]);
引用: JdbcTypeUtil.getRSData 方法 public static Object getRSData(ResultSet rs, String columnName, int jdbcType) throws SQLException { if (jdbcType == Types.BIT || jdbcType == Types.BOOLEAN) { return rs.getByte(columnName); } else { return rs.getObject(columnName); } }
Tinyint取到的类型为-7(Types.BIT) 所以走了 return rs.getByte(columnName); 这步,
public class ResultSetImpl implements ResultSetInternalMethods 这个类实现的rs.getByte(columnName)方法
调用到943行时: if (this.jdbcCompliantTruncationForReads && (valueAsLong < -128L || valueAsLong > 127L)) { this.throwRangeException(String.valueOf(valueAsLong), columnIndex, -6); }
因为是无符号类型,可存储整数值0-255, 所以抛出越界错误
原提问者GitHub用户elfc
已找到解决方案: https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-type-conversions.html
java.lang.Boolean if the configuration property tinyInt1isBit is set to true (the default) and the storage size is 1, or java.lang.Integer if not.
原回答者GitHub用户elfc
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。