对于没有把表情等特殊字符考虑在内的系统,当向数据库写入 emoji 时,数据库就会报错,如下所示:
数据库写入 emoji 时报错
原因
emoji 表情为 4 个字符,而一般 Mysql 的 utf8 编码最多 3 个字节,所以插入时就会报错。
解决方案
前端解决方案
作为一个前端,自己能解决的,绝不麻烦后端同学。在前端,将 emoji 字符先使用 encodeURIComponent 进行转义,写入数据库,然后读取显示时,再使用 decodeURIComponent 进行解码。
更改数据库编码格式
将 Mysql 的编码从 utf8 转换成 utf8mb4。
从 MySQL 5.5.3 开始,MySQL 支持一种 utf8mb4 的字符集,这个字符集能够支持 4 字节的 UTF8 编码的字符。utf8mb4 字符集能够完美地向下兼容 utf8 字符串。在数据存储方面,当一个普通中文字符存入数据库时仍然占用 3 个字节,在存入一个 Unified Emoji 表情的时候,它会自动占用 4 个字节。所以在输入输出时都不会存在乱码的问题了。
要使用 MySQL 的这个特性,首先需要把 MySQL 升级到 5.5.3 以上的版本。
其次,需要修改数据结构中的字符集为 utf8mb4,如 utf8mb4_general_ci。由于 utf8mb4 是 utf8 的超集,从 utf8 升级到 utf8mb4 不会有任何问题,直接升级即可;如果从别的字符集如 gb2312 或者 gbk 转化而来,一定要先备份数据库。
然后,修改 MySQL 的配置文件 /etc/my.cnf,修改连接默认字符集为 utf8mb4,如果是自己写的 PHP 脚本,也可以在连接数据库以后首先执行一句 SQL: SET NAMES utf8mb4;。这时候,PHP 应该就可以正常保存 Emoji 到数据库了。
对于数据库配置不是很懂,以上摘抄自博文 emoji 写入数据库报错处理的方法
参考
1、encodeURIComponent
2、emoji 写入数据库报错处理的方法