记录程序执行存储过程报错后的排查方法及解决方案
一、报错信息
java.sql.SQLException: Incorrect string value: '\xE6\x9C\xAA\xE7\x9F\xA5' for column 'city_a' at row 2
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1811)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1725)
at com.focustar.util.JDBCConnection.save(JDBCConnection.java:333)
at com.focustar.util.JDBCConnection.Save(JDBCConnection.java:61)
at com.focustar.dao.UserDao.insertWeixinUser(UserDao.java:942)
at com.focustar.util.s.e(MainHandlerUtil.java:1421)
at com.focustar.util.s.d(MainHandlerUtil.java:1387)
at com.focustar.util.s.a(MainHandlerUtil.java:97)
at com.focustar.itr.thread.JedisConsumeThread.run(JedisConsumeThread.java:111)
二、场景
1、执行报错的存储过程是从另一个数据库拷贝过来的
2、执行报错的存储过程在原数据库或代码上执行是正常的
三、排查
1、将报错的存储过程sql拷贝后到navicat执行
执行结果:
1.1、执行的存储过程如果传递的参数有中文,执行报错
1.2、执行的存储过程如果传递的参数没有中文,执行正常
猜测:是字符编码的问题
2、查看数据库的字符编码:show variables like ‘character%’;
结果:
1、出问题的数据库:character_set_server = latin1
2、没出问题的数据库:character_set_server = utf8
四、原因
是字符编码的问题
五、解决
方法1、修改mysql的字符编码,将:character_set_server = latin1改为character_set_server = utf8
具体方法请自行百度
方法2、指定存储过程字符类型参数的字符编码【建议使用,影响力度最小】
city_a Varchar(50) CHARACTER SET utf8