nodejs项目mysql使用sequelize支持存储emoji

本篇主要记录nodejs项目阿里云mysql如何支持存储emoji表情。

因由

最近项目遇到用户在文本输入emoji进行存储的时候导致存储失败的问题。经本地调试发现emoji表情在存储时转成的四个字节(\xF0\x9F\x90\xAC)导致sequelize报错,Unhandled rejection SequelizeDatabaseError。由于数据库使用的是utf8字符集utf8_general_ci,这个校对规则(collation)最大只支持3个字节,所以四个字节的emoji就抛异常了...

扩展

上文提到的utf8_general_ciut8_unicode_ci是utf8的两种字符编码方式,不同之处就是对字符的分类(sorting)和对比(comparison)。

MySQL 5.5.3及以后版本支持使用utf8mb4字符集,它在与utf8数据格式处理性能相同基础上加强了对字符码位(code point)的处理能力。与utf8对应的,utf8mb4有utf8mb4_general_ciutf8mb4_general_ci

  • utf8mb4_general_ci 基于Unicode standard sorting与comparison,支持更多的语言种类。
  • utf8mb4_general_ci 不能解析所有的Unicode分类规则,在一些特别的语言或字符处理上存在一定的问题。不过在性能上,它能更快的sorting、comparison,因其采用一组性能相关的快捷方式(performance-related shortcuts)。

解决办法

通过上文我们已经知道一种解决办法了,但有一个硬性条件就是你的数据库版本。当你的数据库版本没有达到5.5.3怎么办呢...总结一下,mysql支持存储emoji表情的方法,至少有两种。

  1. 修改数据库编码为utf8mb4,前提是你的mysql数据库版本必须得是5.5.3及以后的。
  2. 将带emoji的文本转为base64来进行存储,返回时进行相应解码返回(实诚的方法)。

下面介绍我如何使用第一种方法:

  • 将数据库编码由utf8改为utf8mb4。
set character_set_client      = utf8mb4;
set character_set_connection  = utf8mb4;
set character_set_database    = utf8mb4;
set character_set_results     = utf8mb4;
set character_set_server      = utf8mb4;

我们项目用的是阿里的云数据库RDS版,可用其提供的线上管理工具DMS进行设置。

  • 将已经生成的表也转成utf8mb4,
alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;

  • 更新sequelize的配置,主要更改options。关于sequelize相关配置issue可参看

https://github.com/jsha/blocktogether/issues/66 https://github.com/sequelize/sequelize/issues/1220

options: {dialect: "mysql",dialectOptions: {charset: "utf8mb4",collate: "utf8mb4_unicode_ci",supportBigNumbers: true,bigNumberStrings: true}}

至此,重启你的项目,emoji便能够进行存储啦~

ps: 内心要强大到混蛋啊喂~

如想了解更多,请移步我的博客。

转载于:https://www.cnblogs.com/wfsovereign/p/5450704.html

nodejs项目mysql使用sequelize支持存储emoji相关推荐

  1. mysql存储图片node_Node.js教程 阿里云mysql如何支持存储emoji表情

    本篇教程介绍了Node.js教程 阿里云mysql如何支持存储emoji表情,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 本篇主要记录nodejs项目阿里云m ...

  2. emoji表情mysql报错_MySql存储emoji表情报错的处理方法

    mysql存储emoji表情报错的处理方法:更改编码为utf8mb4 uft-8编码可能2个字节.3个字节.4个字节,而MySql的uft-8只支持3字节的数据,而移动端的表情数据是4字节的字符.如果 ...

  3. mysql 存储表情_MySQL支持存储emoji表情

    项目中,项目之前使用的utf8的编码集,但是项目测试过程中,发现需要支持emoji表情,所以考虑将utf8编码更改为utf8mb4. emoji表情是1个字符占4个字节,而utf8编码只支持1-3个字 ...

  4. Sequelize+MySQL存储emoji表情

    一.原因 mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情.但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持em ...

  5. mysql存储emoji表情_MySQL中支持emoji表情的存储

    由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...

  6. emoji java_java存储emoji表情解决方案

    1.问题产生情况 在开发IM时有些有用的头像用了emoji表情或者聊天的时候用了emoji表情,然而mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了.em ...

  7. mysql 主键 uniqo_项目总结,彻底掌握NodeJS中如何使用Sequelize

    前言 sequelize是什么? sequelize是基于NodeJs的ORM框架,它适用于不同的数据库,如:Postgres.MySQL.SQLite.MariaDB,我们可以通过sequelize ...

  8. mysql图标_MySQL 支持 emoji 图标存储

    在MySLQ中 UPDATA 和 INSERT 数据的时候,如果数据上面带有emoji图标,例如:?.?.? 很容易更新或者插入不成功,导致报错. 都快崩溃了,但是还好终于解决了这种鬼问题.资料显示原 ...

  9. 关于用 MySQL 存储 Emoji

    http://www.v2ex.com/t/137724 如果你希望让你的网站或者 App 支持 Emoji,那么在初次设置 MySQL 时,有一些细节你需要知道. Emoji Emoji 字符的特殊 ...

最新文章

  1. IT规划宜分步走 忌盲目好大喜功(载)
  2. Windows 7/8.1 仍可免费升级至 Windows 10
  3. mysql覆盖数据_理解MySQL数据库覆盖索引
  4. 卸载CentOS 5.4自带的OpenJDK,配置新的Java环境
  5. Socket重叠IO
  6. 多线程的线程通信(生产消费)
  7. 三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...
  8. 如何将系统退回上个版本Android,vivo NEX A降级教程,如何回退到旧版本系统的方法...
  9. Java工程师学习指南 中级篇
  10. 二项式在matlab中的应用
  11. 基于springboot+vue的房屋租赁系统(前后端分离)
  12. 云端软件平台 如何共享自己封装的云端软件
  13. kindle dxg 作为电脑扩展显示器
  14. Windows密码设置及破解
  15. 【scratch音乐课】天空之城:音符与节拍、消息与链表
  16. JS加密小结---银行卡号,手机号,姓名加密显示星号
  17. 记录更换固态硬盘免重装系统和环境的操作
  18. AtCoder2362 - Splatter Painting - DFS+思维
  19. Codeforces Round #470 (Div. 2) A Protect Sheep (基础)输入输出的警示、边界处理
  20. 血族手游Lua脚本及资源文件解密

热门文章

  1. nginx uwsgi django部署
  2. 【NOI2011】bzoj2434 阿狸的打字机
  3. 笔记本电脑外放声音吱吱响怎么办?
  4. IDEA环境下SpringBoot项目,@Resource或@Autowired报错could not autowire
  5. 在一个窗体中调用另一个窗体的控件或方法(C#)
  6. git 删除添加的远程地址
  7. css实现网页对联广告
  8. HTML5制作99乘法表
  9. 外卖返利系统/美团/饿了么外卖CPS联盟返利公众号小程序核心源码
  10. 电子面单打印平台对接-快递鸟