源库因为是别人的,没法调整。 源库的默认编码,从库到表到字段都是gbk的。 但是用set names gbk去查询的记录却是乱码的,然而用set names utf8能正常显示,说明数据其实是用utf8来存的。
otter里,canal的配置一开始是配utf8,然后报Incorrect string value,后来试了下改成gbk,乱码解决了,这里我是查看新进的insert语句,看到新的记录确实是能显示的,用的是utf8的session查询,因为我输出端设的是utf8为了保证和数据编码一致。 后来跑了会,还是报了Incorrect string value这个错,这次我看了下日志,内容都解析出来了,本来日志里都是乱码,现在canal配成gbk后,select和load日志都能正常显示,但是程序还是挂起报了Incorrect string value这个错。
感觉问题是出在解析后往目标数据库导入的时候,有些特殊字符不在gbk范围内导致的,但是我数据源都是配的utf8
EventColumn[index=39,columnType=12,columnName=F_INFO_DECISION_BASIS,columnValue= (1)国家有关法律、法规和本基金契约的有关规定(2)国家宏观经济环境及其对证券市场的影响 (3)货币政策的变化 (4)利率走势与通货膨胀预期 (5)地区及行业发展状况 (6)上市公司价值发现 (7)国内及世界著名研究机构的研究报告,isNull=false,isKey=false,isUpdate=true]
这是select的日志感觉是 这个字符导致的 这是这串字符串的16进制 0000000: ee97 99ee 9799 2831 29e5 9bbd e5ae b6e6 ......(1)....... 0000010: 9c89 e585 b3e6 b395 e5be 8be3 8081 e6b3 ................ 0000020: 95e8 a784 e592 8ce6 9cac e59f bae9 8791 ................ 0000030: e5a5 91e7 baa6 e79a 84e6 9c89 e585 b3e8 ................ 0000040: a784 e5ae 9aee 9799 ee97 9928 3229 e59b ...........(2).. 0000050: bde5 aeb6 e5ae 8fe8 a782 e7bb 8fe6 b58e ................ 0000060: e78e afe5 a283 e58f 8ae5 85b6 e5af b9e8 ................ 0000070: af81 e588 b8e5 b882 e59c bae7 9a84 e5bd ................ 0000080: b1e5 938d ee97 99ee 9799 2833 29e8 b4a7 ..........(3)... 0000090: e5b8 81e6 94bf e7ad 96e7 9a84 e58f 98e5 ................ 00000a0: 8c96 ee97 99ee 9799 2834 29e5 88a9 e78e ........(4)..... 00000b0: 87e8 b5b0 e58a bfe4 b88e e980 9ae8 b4a7 ................ 00000c0: e886 a8e8 8380 e9a2 84e6 9c9f ee97 99ee ................ 00000d0: 9799 2835 29e5 9cb0 e58c bae5 8f8a e8a1 ..(5)........... 00000e0: 8ce4 b89a e58f 91e5 b195 e78a b6e5 86b5 ................ 00000f0: ee97 99ee 9799 2836 29e4 b88a e5b8 82e5 ......(6)....... 0000100: 85ac e58f b8e4 bbb7 e580 bce5 8f91 e78e ................ 0000110: b0ee 9799 ee97 9928 3729 e59b bde5 8685 .......(7)...... 0000120: e58f 8ae4 b896 e795 8ce8 9197 e590 8de7 ................ 0000130: a094 e7a9 b6e6 9cba e69e 84e7 9a84 e7a0 ................ 0000140: 94e7 a9b6 e68a a5e5 918a 0a ...........
下面是错误信息: Caused by: com.alibaba.otter.node.etl.load.exception.LoadException: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [insert into xxxxx.xxxxxxxx(col1,col2...) values (?...) on duplicate key update col1=values(col1) , col2=values(col2) , ...]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xEE\x97\x99\xEE\x97\x99...' for column 'F_INFO_DECISION_BASIS' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xEE\x97\x99\xEE\x97\x99...' for column 'F_INFO_DECISION_BASIS' at row 1 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868) at com.alibaba.otter.node.etl.load.loader.db.DbLoadAction$DbLoadWorker$2.doInTransaction(DbLoadAction.java:621) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) at com.alibaba.otter.node.etl.load.loader.db.DbLoadAction$DbLoadWorker.doCall(DbLoadAction.java:613) at com.alibaba.otter.node.etl.load.loader.db.DbLoadAction$DbLoadWorker.call(DbLoadAction.java:541) at com.alibaba.otter.node.etl.load.loader.db.DbLoadAction.doTwoPhase(DbLoadAction.java:458) at com.alibaba.otter.node.etl.load.loader.db.DbLoadAction.doLoad(DbLoadAction.java:275) at com.alibaba.otter.node.etl.load.loader.db.DbLoadAction.load(DbLoadAction.java:161) ... at java.lang.Thread.run(Thread.java:745) Caused by: java.sql.SQLException: Incorrect string value: '\xEE\x97\x99\xEE\x97\x99...' for column 'F_INFO_DECISION_BASIS' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) .... at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) ... 21 more
F_INFO_DECISION_BASIS这个字段是gbk的编码,表也是gbk的,库也是,但是数据应该是utf8的格式存的。。。。
原提问者GitHub用户 welyss
把目标库的编码都改成utf8之后正常了。感觉目标数据源没有用上utf8的编码。但是我数据源确实是配的utf8。
原回答者GitHub用户 welyss
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。