由于前期建站不注意细节,数据库使用了UTF-8编码,当数据上面带有emoji图标时,例如:?、?、?等表情,存储后表情消失,甚至导致报错,一直找不到原因。
尽管如此,但影响不大,页面还是能正常访问,表情无法显示而已。
到了《熙慧来琳》微信小程序上线后,问题便凸显出来,当带有emoji表情微信名的用户对文章进行评论时,提示评论失败,对文章点赞将直接导致文章无法显示……今天终于解决了这个问题,发一篇文章作为记录。
经过站友提醒,才发现是数据库编码的原因,据资料显示,在MYSQL5.5前,UTF-8编码只支持1-3个字节,只支持BMP这部分的unicode编码区,而emoji表情恰好是4个字节的编码进行存储。从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。所以要解决问题,必需把数据库表字符编码全部改成utf8mb4。
常用编码类型:
- ASCII:美国信息互换标准编码;英语和其他西欧语言;单字节编码,7位表示一个字符,共128字符。
- GBK:双字节,汉字内码扩展规范;中日韩汉字、英文、数字;双字节编码;共收录了21003个汉字,GB2312的扩展。
- UTF-8:Unicode标准的可变长度字符编码;Unicode标准(统一码),业界统一标准,包括世界上数十种文字的系统。
- UTF-8:使用一至三个字节为每个字符编码。
- utf8mb4:存储四个字节,应用场景用于存储emoji表情,因为可以emoji表情四个字节。
- utf8mb4:MySQL版本 > 5.5.3 。
- 其他常见字符集:UTF-32,UTF-16,Big5,latin1
- 数据库中的字符集包含两层含义
各种文字和符号的集合,包括各国家文字、标点符号、图形符号、数字等。
字符的编码方式,即二进制数据与字符的映射规则。
第一步:对数据库进行备份。
第二步:确认数据库版本为5.5以上,如版本过久则进行升级。
第三步:把数据库、表、字段转换为utf8mb4。
# 对每一个数据库:
ALTER DATABASE 这里数据库名字 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# 对每一个表:
ALTER TABLE 这里是表名字 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 对每一个字段:
ALTER TABLE 这里是表名字 CHANGE 字段名字 重复字段名字 VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 上面一句或者使用modify来更改
ALTER TABLE 这里是表名字 modify 字段名字 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '';
例如我的数据库名称是『holyshit』,在phpMyAdmin的SQL中填入:
ALTER DATABASE holyshit CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
然后点『执行』
第四步:修改MySQL的配置。
在我系统上到/etc/my.cnf文件,并打开修改。如果它不存在,我们需要创建这样一个文件并修改。
复制以下内容,粘贴至my.cnf文件末尾处。
[client]
default-character-set = utf8mb4[mysql]
default-character-set = utf8mb4[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
最后一步:重启MySQL,并检查utf8mb4是否生效。
通过SQL进行查询:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
如图显示则修改成功!
下面测试一下emoji表情的显示情况:
????????☺️????????????????????????????☹️????????????????????????????????????????????☠️???????????????????????????✊???????✌????????????☝?✋???????????????✍????????????????????????????????♀️??????????♀️????♀️????♀️????♀️????♀️????⚕️??⚕️????????????……
欢迎大家能在下面用emoji表情评论测试~
.