如何让MySQL支持utf8mb4字符集技术
就像我前面文章提到的,我一直很想亲自试试 utf8mb4 字符集,这个支持 emoji 的字符集到底是有什么样的魔力。
下面讲述了实现的方式。
前提条件是 MySQL5.5 版本之后才可以支持,目前新买的 VPS,新装的系统一般都是支持的。
[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 才有意义。
暂无