根本的原因在于,采用 utf8 编码的 MySQL 无法保存占位是4个字节的 Emoji 表情。MYSQL 5.5 之前, UTF8 编码只支持1-3个字节
为了使后端的项目,全面支持客户端输入的 Emoji 表情,升级编码为 utf8mb4 是最佳解决方案。
强调:因为utf8mb4是utf8的超集,理论上即使client修改字符集为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。
2、查看是否支持utf8mb4?
现在SSH中输入命令: mysql -uroot -p
输入密码后进入mysql,然后再输入下面命令,确认 mysql server 是否支持 utf8mb4 编码。
mysql> SHOW CHAR SET WHERE Charset LIKE "%utf8%";
我们会看见如下显示:
+---------+---------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+---------------+--------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
+---------+---------------+--------------------+--------+
或者用下面的语句也可。
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
此时会显示如下内容,表示支持utf8mb4
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)
至于排序规则(collation) 选择默认的 utf8mb4_general_ci,还是 utf8mb4_unicode_ci。
一般来说从排序的准确性,以及性能方面,我们应该选用 utf8mb4_unicode_ci 。
3、修改方法
服务器端,修改数据库配置文件/etc/my.cnf
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
lower_case_table_names = 1
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysql.server]
default-character-set = utf8mb4
[mysqld_safe]
default-character-set = utf8mb4
4、记得重启mysql.
win下面执行下列语句
net stop mysql
net start mysql
linux下面执行如下语句即可
service mysqld restart
---
转载请注明本文标题和链接:《MySQL乱码问题以及utf8mb4字符集》
发表评论