Textpattern:让博客支持 Emoji

Textpattern 在4.6.0版本中已经支持Emoji, 并将数据库字符集默认为 utf8mb4

Changed: Default charset is now utf8mb4: supports a wider range of characters, including emoji.
来源: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

参考: MySQL utf8 vs utf8mb4

评论已关闭。Comments are turned off for this article.