nodejs项目mysql使用sequelize支持存储emoji
2016-05-01 16:26
816 查看
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_ci与
ut8_unicode_ci是utf8的两种字符编码方式,不同之处就是对字符的分类(sorting)和对比(comparison)。
MySQL 5.5.3及以后版本支持使用utf8mb4字符集,它在与utf8数据格式处理性能相同基础上加强了对字符码位(code point)的处理能力。与utf8对应的,utf8mb4有
utf8mb4_general_ci和
utf8mb4_general_ci。
utf8mb4_general_ci 基于Unicode standard sorting与comparison,支持更多的语言种类。
utf8mb4_general_ci 不能解析所有的Unicode分类规则,在一些特别的语言或字符处理上存在一定的问题。不过在性能上,它能更快的sorting、comparison,因其采用一组性能相关的快捷方式(performance-related shortcuts)。
解决办法
通过上文我们已经知道一种解决办法了,但有一个硬性条件就是你的数据库版本。当你的数据库版本没有达到5.5.3怎么办呢...总结一下,mysql支持存储emoji表情的方法,至少有两种。修改数据库编码为utf8mb4,前提是你的mysql数据库版本必须得是5.5.3及以后的。
将带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可参看
options: { dialect: "mysql", dialectOptions: { charset: "utf8mb4", collate: "utf8mb4_unicode_ci", supportBigNumbers: true, bigNumberStrings: true } }
至此,重启你的项目,emoji便能够进行存储啦~
ps: 内心要强大到混蛋啊喂~
如想了解更多,请移步我的博客。
相关文章推荐
- 深入浅出Nodejs
- leetcode——117——Populating Next Right Pointers in Each Node II
- nodejs笔记之:事件驱动,线程池,非阻塞,异常处理等
- [git]ssh: Could not resolve hostname github.com: nodename nor servname provided, or not known
- leetcode——116—— Populating Next Right Pointers in Each Node
- nodejs 核心模块crypto
- 42-Remove Nth Node From End of List
- win10下安装nodejs
- nodejs原生模块简介
- HtmlAgilityPack 之 HtmlNode类
- node.js的一些知识
- 34. Swap Nodes in Pairs
- osx升级nodejs6.0后一些问题
- 《Nodejs开发加密货币》之五:您必须知道的几个Nodejs编码习惯
- 《Nodejs开发加密货币》之四:Nodejs让后台开发像前端一样简单
- nodejs包高效升级插件npm-check-updates
- 《Nodejs开发加密货币》之三:Nodejs让您的前端开发像子弹飞一样
- 《Nodejs开发加密货币》之二:Nodejs原来在币圈如此流行?
- 《Nodejs开发加密货币》之一:开栏的话
- Hexo+Coding博客的安装和使用