nodejs項目mysql使用sequelize支持存儲emoji
本篇主要記錄nodejs項目阿里雲mysql如何支持存儲emoji表情。node
因由
最近項目遇到用戶在文本輸入emoji進行存儲的時候致使存儲失敗的問題。經本地調試發現emoji表情在存儲時轉成的四個字節(\xF0\x9F\x90\xAC)致使sequelize報錯,Unhandled rejection SequelizeDatabaseError。因爲數據庫使用的是utf8字符集utf8_general_ci,這個校對規則(collation)最大隻支持3個字節,因此四個字節的emoji就拋異常了...mysql
擴展
上文提到的utf8_general_ci
與ut8_unicode_ci
是utf8的兩種字符編碼方式,不一樣之處就是對字符的分類(sorting)和對比(comparison)。git
MySQL 5.5.3及之後版本支持使用utf8mb4字符集,它在與utf8數據格式處理性能相同基礎上增強了對字符碼位(code point)的處理能力。與utf8對應的,utf8mb4有utf8mb4_general_ci
和utf8mb4_general_ci
。github
- utf8mb4_general_ci 基於Unicode standard sorting與comparison,支持更多的語言種類。
- utf8mb4_general_ci 不能解析全部的Unicode分類規則,在一些特別的語言或字符處理上存在必定的問題。不過在性能上,它能更快的sorting、comparison,因其採用一組性能相關的快捷方式(performance-related shortcuts)。
解決辦法
經過上文咱們已經知道一種解決辦法了,但有一個硬性條件就是你的數據庫版本。當你的數據庫版本沒有達到5.5.3怎麼辦呢...總結一下,mysql支持存儲emoji表情的方法,至少有兩種。web
- 修改數據庫編碼爲utf8mb4,前提是你的mysql數據庫版本必須得是5.5.3及之後的。
- 將帶emoji的文本轉爲base64來進行存儲,返回時進行相應解碼返回(實誠的方法)。
下面介紹我如何使用第一種方法:sql
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進行設置。數據庫
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: 心裏要強大到混蛋啊喂~阿里雲