记一次生产事故踩坑。血淋淋的惨痛教训
众所周知 mysql 存 emoji 表情要用 utf8mb4 这个字符集
OK 没问题,设置 nick_name 为 utf8mb4 varchar(50)
测试的结果:
emoji 表情储存成功
没有问题 完全oj8k 发生产!
微信公众号做了推送,为了抗住流量,还准备了100台服务器。
晚上监控流量,服务器各项指标正常。
但是一看日志,发现日志疯狂报错:部分敏感信息及参数已删除
exception[order=UserInfoRequestType{activityId=, uid=, nickName=wing.?, headImgUrl=}]
org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\x9D' for column 'nick_name' at row 1
### The error occurred while setting parameters
### SQL: insert into s_user_info (id,nick_name,uid,support_detail,popularity,img_url,DataChange_CreateTime,DataChange_LastTime,activity_id) values (?, ?, ?, ?, ?, ?, ?,?,?)
### Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\x9D' for column 'nick_name' at row 1
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\x9F\x90\x9D' for column 'nick_name' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\x9D' for column 'nick_name' at row 1 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
看到一堆的报错,马上就慌了。
nick_name 存不进去,仔细调研发现是 部分emoji表情的用户 的 昵称储存失败。OK,马上fixbug,字符串存不了,我转base64总可以了吧,改完发测试环境,测试测了这个接口没有问题,又发生产,结果引起了另外一个接口的报错,瞬间又是一堆错误日志,整个人瞬间斯巴达了 emmm...... 于是马上回退到上一个版本,让部分特殊emoji表情的用户无法活动。再继续fixbug。
现在库里既有base64的昵称 也有未 base64 的昵称 。真是让人头大。
经过周末两天的加班,终于把这个问题稳定的解决了:
数据库存 base64 encode 的 昵称, 从DB取出来时 decode一下。
总结:
这是我的一点踩坑经历,希望能给看到文章的你一点帮助。