现在应用大量的地方会使用到emoji表情,例如微信昵称,聊天内容,好友请求等等。如果还是使用ut8会出现乱码,因为UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,
utf8mb4则扩展到一个字符最多能有4字节,并且兼容utf8,唯一的缺点就是占用存储空间会比ut8大一点。
如果采用在代码内碰到emoji字符时进行编码处理,一个系统涉及到的地方实在太多,并且需要多个端同步配合(服务端、移动端、web等),灵活性差,容易出bug。
比较好的解决方案是,
在数据库直接存存储emoji字符,然后在服务端连接数据库时设置pdo连接(或其它连接方式)字符集,用户端这样就不用做任何处理便可以顺利的存储和读取emoji,具体步骤如下:
1、修改数据库配置 my.cnf
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
2、重启mysql,检查字符集
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 |
+--------------------------+--------------------+
| 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 |
+--------------------------+--------------------
3、修改php连接的pdo字符集
开始之前,请确保你已经安装了 PHP PDO 扩展和你所使用的数据库的 PDO 驱动(例如 MySQL 的 pdo_mysql
)。对于使用关系型数据库来讲,这是基本要求。
驱动和扩展安装可用后,打开 config/db.php
修改里面的配置参数对应你的数据库配置。该文件默认包含这些内容:
<?php
return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
];
4、修改具体字段的字符集
例如用户昵称需要存放emoji表情,修改用户表的昵称字段
ALTER TABLE t_user MODIFY COLUMN nickname varchar(255) CHARACTER SET utf8mb4 not NULL DEFAULT '' COMMENT '昵称'
做完以上四步就可以安心的在客户端使用emoji来保存个性昵称、发送个性信息、以及日志记录也不会出现问题了!!!