在开发微信公众号获取用户昵称的时候,出现了很大的问题,一开始只是设计的数据库的编码为UTF-8,但是在当用户的nickName设置为表情的符号的时候就会出错,utf8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。其中Emoji表情是4个字节,而MySql的utf8编码最多3个字节,所以导致了数据插不进去。
准备:
mysql从5.5.3开始支持utf8mb4
1、数据库表准备
再我们从utf-8修改为utf8mb4 的时候,很多的字段属性会受到影响
1.1 unique 设置的字段长度不能过长
1.2 varchar(1000) 过长的时候,要设置为text类型
1.3 为了防止出错,以后开发尽量使用这种字符格式的数据库,如果一旦表多了起来,很麻烦,大部分时候,需要我们将表进行重新执行sql。写入数据库,很麻烦的。
2、修改数据库的编码集
数据库为阿里云的数据库RDS,修改编码非常容易

修改完成之后,要注意提交参数,mysql服务器实例会重新启动
3、对于我们自己设置的数据库
改mysql的配置文件/etc/mysql/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'
重启数据库
mysql restart
4、校验服务器字符集设置
mysql> show variables like '%char%'; +--------------------------+----------------------------------+ | 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 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec)
5、建库或者是更新编码
// 创建数据库 create database duodian default character set utf8mb4 collate utf8mb4_unicode_ci ; // 修改数据库 ALTER DATABASE duodianyouhui CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ; // 修改表 ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; // 修改字段 alter table user_info modify column nickName varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
6、对昵称进行转码和解码
在实际应用中,遇上有些特别偏门的Emoji符号时,按照上述的方法配置依然是会导致写入数据库失败的。因此,为确保万无一失,对昵称写入数据库前进行转码,读取时进行解码。
<?php // 转码 base64_encode($nickname); // 解码 base64_decode($nickname); ?>