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

本文详述了在Node.js项目中,如何处理阿里云MySQL存储emoji表情的问题。由于utf8字符集限制,需升级到utf8mb4或使用base64编码。通过修改数据库和表的字符集,以及调整sequelize配置,可以成功存储emoji。
摘要由CSDN通过智能技术生成

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

<

本篇主要记录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可参看

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便能够进行存储啦~

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注WEB前端Node.js频道!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值