WenRou's Blog
MySQL乱码问题以及utf8mb4字符集
2015-11-23 温柔哥
1、为什么要使用 utf8mb4 编码

根本的原因在于,采用 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







 
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容