项目场景:
需求是把app的一些页面需要迁移到公众号去,具体的业务就不阐述了.搬迁的话需要解决用户信息的问题,所有首先就需要实现微信账号和app账号进行一个绑定!
问题描述
开发测试过程中都比较顺利,直到上线后发现微信绑定账号的时候报错了(非必现),找运维拿到了日志如下:
Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xB1 C...' for column 'nick_name' at row 1
uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x90\xB1 C...' for column 'wx_nick_name' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xB1 C...' for column 'wx_nick_name' at row 1 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
原因分析:
看到报错是很明显,编码问题嘛。这个问题一看就是常规问题,百度一下就能解决哇!
百度帖子基本的方案:
修改表、修改字段都试了还是不行,关键是我可以直接把表情复制到库里面,却不能通过ibatis插入,到这里我就知道是程序的问题了。
-
修改库、表、字段的编码为utf8mb4
-
修改链接:javaCopy codeString url = "jdbc:mysql://localhost:3306/database_name?useUnicode=yes&characterEncoding=UTF-8";
-
还是不行就转码String content = StringEscapeUtils.escapeJava(originalContent);
解决方案:(是驱动的版本太低了,升级mysql-connector-java)
我还是说一下我解决过程中的思路吧:
- 修改成正确编码uft8mbt,能直接通过Navicat工具把表情存到库里面,但是程序插入还是报错,懵逼了。。。。
- 修改编码之后还是不行,改成utf8编码,然后用Navicat更新的时候发现会直接弹窗报错,这时候就确定了编码没有问题,有问题的是程序。
- 程序那儿有问题我也不清楚,就启动了另一个项目只要编码对了就能插入表情,我这个项目就不行。
- 将编码改成utf8两个项目都报错,但是报错的异常栈 不一样,观察了一下这些方法是sql驱动里面,最后我就确定了是驱动版本低引起的。