引起解析失败的语句如下:
sql_mode='' UPDATE members SET money = money + 103. WHERE id = 1234 AND money >= '103.'
otter报错日志如下 exception:canal:to_big:com.alibaba.otter.canal.parse.exception.CanalParseException: java.lang.NumberFormatException: For input string: "1300." Caused by: java.lang.NumberFormatException: For input string: "1300." at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.math.BigInteger.(BigInteger.java:470) at java.math.BigInteger.(BigInteger.java:606) at com.alibaba.fastsql.sql.parser.Lexer.integerValue(Lexer.java:2442) at com.alibaba.fastsql.sql.parser.SQLExprParser.primary(SQLExprParser.java:386) at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:205) at com.alibaba.fastsql.sql.parser.SQLExprParser.bitXor(SQLExprParser.java:121) at com.alibaba.fastsql.sql.parser.SQLExprParser.multiplicative(SQLExprParser.java:208) at com.alibaba.fastsql.sql.parser.SQLExprParser.additiveRest(SQLExprParser.java:2099) at com.alibaba.fastsql.sql.parser.SQLExprParser.exprRest(SQLExprParser.java:106) at com.alibaba.fastsql.sql.parser.SQLExprParser.expr(SQLExprParser.java:99) at com.alibaba.fastsql.sql.parser.SQLExprParser.parseUpdateSetItem(SQLExprParser.java:1910) at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlSelectParser.parseUpdateStatment(MySqlSelectParser.java:496) at com.alibaba.fastsql.sql.dialect.mysql.parser.MySqlStatementParser.parseUpdateStatement(MySqlStatementParser.java:111) at com.alibaba.fastsql.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:218) at com.alibaba.fastsql.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:93) at com.alibaba.fastsql.sql.SQLUtils.parseStatements(SQLUtils.java:534) at com.alibaba.otter.canal.parse.inbound.mysql.ddl.DruidDdlParser.parse(DruidDdlParser.java:51) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseRowsQueryEvent(LogEventConvert.java:379) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:130) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parse(LogEventConvert.java:67) at com.alibaba.otter.canal.parse.inbound.AbstractEventParser.parseAndProfilingIfNecessary(AbstractEventParser.java:409) at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3$1.sink(AbstractEventParser.java:209) at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:168) at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:271) at java.lang.Thread.run(Thread.java:748)
原提问者Github用户tianqizhanhao1234
这个错误是因为 Otter 解析 binlog 时遇到了一个数字格式不正确的问题,具体来说是一个字符串 '1300.'
无法转换成整数。
建议检查一下数据源中 members
表的 money
字段是否定义为整数类型,如果是,则可能是数据源中存在错误数据,例如 money
字段中有一个值是 '1300.'
这样的字符串,导致 Otter 解析失败。如果是这种情况,可以通过修改数据源中的数据来解决问题。
如果 money
字段不是整数类型,则需要检查 Otter 配置文件中的数据类型是否正确,以及 Otter 是否正确地将该字段解析为了整数类型。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。