上午,开发和我说某表有时插入报:Incorrect string value: '\xF0\x9F\x98\x9C \xE9...' for column 'Nickname' at row 1,我的第一反应是:难道是sql_mode的问题。后来经排查是:字符集的问题。因为用户录入了表情字符。utf8字符编码不支持
Emoji表情存储。UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。
解决方案:将Mysql的编码从utf8转换成utf8mb4。
1.修改配置文件my.cnf character-set-server=utf8mb4 2、将已经建好的表转换成utfbmb4 命令:ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; (将TABLE_NAME替换成你的表名) 3、将需要使用emoji的字段设置类型为utf8mb4 ALTER TABLE WU_WeChatUser MODIFY COLUMN `Nickname` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '用户的昵称' ;
总结:后续又实际测试了一遍,1)set names utf8mb4(在命令行可以动态修改) 2)修改该字段为utf8mb4_general_ci 3)修改配置文件:character-set-sever(重启永久生效)
注意:本次测试我只按以上步骤修改,并未修改表的字符集, 数据库的字符编码的优先级: 列>表>库
查看 MySQL 数据列(column)的字符集。
mysql> show full columns from WU_WeChatUser; +-------------+--------------+--------------------+------+-----+-------------------+----------------+---------------------------------+-----------------------------------------------------------------------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------------+--------------+--------------------+------+-----+-------------------+----------------+---------------------------------+-----------------------------------------------------------------------+ | Id | int(10) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | 主键Id | | Subscribe | tinyint(3) | NULL | YES | | 1 | | select,insert,update,references | 用户是否订阅该公众号1:是 2:否 | | Openid | varchar(100) | utf8_general_ci | NO | MUL | NULL | | select,insert,update,references | 用户openId | | Nickname | varchar(200) | utf8mb4_general_ci | YES | | NULL | | select,insert,update,references | 用户的昵称 | | Sex | int(5) | NULL | YES | | 0 | | select,insert,update,references | 用户的性别,1男,2女,0未知 | | Language | varchar(50) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 用户的语言 | | Province | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 省 | | City | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 市 | | Country | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 国家 | | SourceIndex | int(10) | NULL | NO | MUL | 0 | | select,insert,update,references | 渠道来源索引,0:未知来源,其余值取自WU_WeChat_SourceType | | OperateTime | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 操作时间 | | CreateTime | timestamp | NULL | NO | | CURRENT_TIMESTAMP | | select,insert,update,references | 创建时间 | +-------------+--------------+--------------------+------+-----+-------------------+----------------+---------------------------------+-----------------------------------------------------------------------+ 12 rows in set (0.00 sec)