前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql uftb8mb4 储存 emoji 表情失败

mysql uftb8mb4 储存 emoji 表情失败

作者头像
用户2141593
发布2019-02-20 11:06:24
2.7K0
发布2019-02-20 11:06:24
举报
文章被收录于专栏:Java进阶

记一次生产事故踩坑。血淋淋的惨痛教训

众所周知 mysql 存 emoji 表情要用 utf8mb4 这个字符集

OK 没问题,设置 nick_name 为 utf8mb4 varchar(50)

测试的结果:

    emoji 表情储存成功

没有问题  完全oj8k  发生产!

微信公众号做了推送,为了抗住流量,还准备了100台服务器。

晚上监控流量,服务器各项指标正常。

但是一看日志,发现日志疯狂报错:部分敏感信息及参数已删除

代码语言:javascript
复制
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一下。

总结:

  • 1、我设置了utf8mb4 还是无法储存部分 moji 表情的原因是:新的moji 表情越来越多,mysql 版本却没有跟上,导致新的moji 表情存不进去。
  • 2、mysql 存 moji 表情 不要完全依赖 utf8mb4这个字符集来帮你处理 , 可以就选用utf8 长度给长一点 转 base64 后存,取的时候再转成字符串就行,当然转base64 的 encode  和 decode 操作都会消耗你 CPU 的 性能,在高并发场景下要多测试,然后进行方案的取舍。
  • 3、在GitHub上找到 emoji-java 这个来解决,下次我应该就会用这个来处理emoji表情了。
  • 4、就算是高并发场景,遇到生产环境大量报错不要慌,不要急,要稳住心态,只要一些硬性指标(比如订单量)没有下降就还能撑住。
  • 5、学会批判的看事情,百度得到的答案不一定对,相信很多人遇到要存moji 表情 都是 直接谷歌或是百度 mysql 如何存 emoji表情,然后看到一堆文章,找了篇看起来很多的,就拿着参考开始实践了。我们还需要站到对立面多思考一个问题:Emoji表情存储至Mysql报错问题,于是你就能找到这篇:JAVA解决Emoji表情存储至Mysql报错问题 就不会踩坑了

这是我的一点踩坑经历,希望能给看到文章的你一点帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档