LMLPHP后院

如何让MySQL支持utf8mb4字符集技术

maybe yes 发表于 2016-11-27 18:48

就像我前面文章提到的,我一直很想亲自试试 utf8mb4 字符集,这个支持 emoji 的字符集到底是有什么样的魔力。

下面讲述了实现的方式。

前提条件是 MySQL5.5 版本之后才可以支持,目前新买的 VPS,新装的系统一般都是支持的。

修改 /etc/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
init_connect='SET NAMES utf8mb4'

上面将 client,mysql,mysqld 都设置成支持 utf8mb4 字符集,重启 MySQL 即可生效。

重启后,在 mysql 命令行执行如下 SQL,查看字符集。

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
 rows in set (0.00 sec)

修改某个字段的字符集,如下示例:

alter table {table_name} modify column {column_name} varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改数据库表的字符集,如下示例:

ALTER TABLE {table_name} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

遇到的问题,在 Ubuntu操作请不要使用 service 的方式重启 MySQL,这样会导致奇怪错误,比如无法启动等,直接在 /etc/init.d/ 下面重启。

关于网页支持 utf8mb4 问题。在使用 PDO 操作的时候,如果提交了 emoji 表情到数据库,并且数据库不支持 emoji 时,会直接将 emoji 后面内容全部丢掉,这个我测试过,是血的教训,算是 PDO 的一个坑吧。如果数据库支持 emoji 是可以将它保存到数据库的,但是这个字符在网页上是显示不了的,就像一个空格一样,所以如果为了只做网站而去支持 emoji 表情意义不大,也有人想到使用 javascript 的方式来替换 emoji 字符为图片,我认为这样做就很没有必要了。emoji 天生是为移动而生的,主要场景为移动设备的聊天记录,如果您的应用需要接入微信聊天,那么将这个表支持 utf8mb4 才有意义。

2021-09-25 21:37:27 1632577047 0.021511