Textpattern:让博客支持 Emoji
Textpattern 在4.6.0版本中已经支持Emoji, 并将数据库字符集默认为 utf8mb4
Changed: Default charset is now
utf8mb4
: supports a wider range of characters, includingemoji
.
来源:Textpattern CMS 4.6.0 released: it’s big
背景
此博客系统是自己通过早期的版本逐步升级至现在的 4.7.0 版,所以数据库字符集格式还是停留在之前的 utf-8
, 最近转发 璟宝的Moment 内容至博客文章时,发现Emoji表情无法支持,保存文章时直接被过滤。
实验
于是,自己开始寻找原因,首先是Google搜索关键词: Textpattern+Emoji ,发现并没有太多结果,但从结果中发现跟数据库的字符集有关。
其次,根据搜索结果方案在本地测试环境实验:修改数据库及表字符集为 utf8mb4_unicode_ci
,命令如下:
alter table database_name convert to character set utf8mb4 collate utf8mb4_unicode_ci;
然后把 Textpattern 的 config.php
中的 $txpcfg['dbcharset'] = 'utf8';
修改为 $txpcfg['dbcharset'] = 'utf8mb4';
最后文章发布带有 Emoji 表情图标的文章,发现浏览后可以正常显示,实验成功!
生产部署
已经知道文章需要支持Emoji 的原因后,我准备为生产坏镜升级。开始之前, 必须要备份数据库,以防万一!
备份数据
登录生产,通过 mysqldump
命令完成数据库备份。
[root@linux ~]# mysqldump -h localhost -p [数据库名] -u[用户名] >[_bak-文件名.sql]
[root@linux ~]# Password: *** 输入密码
[root@linux ~]# >
升级工作
通过终端工具登录MySQL mysql -u[用户名] -p[密码]
,选择数据库 mysql> use database_name
1、升级数据库
# Run this once on each schema you have (Replace database_name with your schema name)
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
2. 升级数据表
# Run this once for each table you have (replace table_name with the table name)
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3、升级数据字段
# Run this for each column (replace table name, column_name, the column type, maximum length, etc.)
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4、修改配置文件
数据库及表字符集转换升级后,一定要记得修改应用程序的配置文件,通常是处理与数据库连接的 config.php
,比如:Textpattern中,需将 config.php
文件内容 $txpcfg['dbcharset'] = 'utf8';
修改为 $txpcfg['dbcharset'] = 'utf8mb4';
效果验证
数据库及表升级后,使用 MySQL命令查看所有字段的字符集。
mysql> show full columns from table_name;
返回的结果可以看到该表下的所有字段以及字符集等信息,确认已经转成 utf8mb4_unicode_ci
即可。
然后进入博客系统后台,发表带有 Emoji 表情内容,观察是否发布成功,可以正常保存则验证通过,此时浏览文章能正常看到Emoji表情,升级工作完成。(Emoji 表情文章: 贝比成长记:5岁能讲故事的孩子,学习成绩不会差 )
科普
有关utf8mb4 与 utf8的区别,可以搜索: utf8mb4 vs utf8
, 核心就是utf8mb4可以支持4个字节,而utf8是三个,所以当遇到 Emoji 这种宽字节时就产生错误: Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1