微信含emoji表情昵称入库失败:HY000,1366, Incorrect string value

赞赏 2017-07-28

最近日志中发现,如下错误:
PHP Fatal error: Uncaught Comm_Db_PdoMysqlException: HY000,1366, Incorrect string value: '\xF0\x9F\x90\x9C\xF0\x9F...' for column 'nickname' at row 1 in ...


定位发现是微信用户表插入失败,网上查到是因为微信昵称中包含emoji表情 

(参考文章:http://blog.csdn.net/everything_is_ok/article/details/42454451

utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符,要想让mysql支持4个字节的emoji表情,得用utf8mb4编码。(utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符)

前段时间还看过数据库编码的相关文章,里面也提到为了适应移动表情数据,一些新表DBA都要求用 utf8mb4编码。

上面那篇参考文章提到通过转码的方式解决,如果修改数据编码不方便的话,这是不错的办法。

但目前我们的库还小结构也简单,还是直接改成utf8mb4的好。


更改数据库的编码为utf8mb4:

以下内容参考这篇文章,略有调整。

http://blog.csdn.net/pzw_0612/article/details/53841333


utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。

(先在测试库上进行,测试没问题了再去线上执行)

步骤如下:  

1. 修改MySQL配置文件

修改mysql配置文件my.cnf(windows为my.ini) 
在以下三部分里添加如下内容: 

[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'


2. 重启数据库,检查变量


SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';


Variable_nameValue
character_set_clientutf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_filesystembinary
character_set_resultsutf8mb4
character_set_serverutf8mb4
character_set_systemutf8
collation_connectionutf8mb4_unicode_ci
collation_databaseutf8mb4_unicode_ci
collation_serverutf8mb4_unicode_ci

collation_connection 、collation_database 、collation_server是什么没关系。

但必须保证

系统变量描述
character_set_client(客户端来源数据使用的字符集)
character_set_connection(连接层字符集)
character_set_database(当前选中数据库的默认字符集)
character_set_results(查询结果字符集)
character_set_server(默认的内部操作字符集)

这几个变量必须是utf8mb4。


3. 修改代码中数据库连接的配置


PDO连接参数中把 SET NAMES utf8 改成 SET NAMES utf8mb4



4. 将数据库和已经建好的表也转换成utf8mb4

更改数据库编码:

ALTER DATABASE qujing CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

更改表编码:

ALTER TABLE user_wx CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

登陆后阅读全文
阅读 2770 赞赏 0 有用 7 没用 1 收藏 1 分享

   



0 条留言

山君的头像

山君

斯人若彩虹,遇上方知有

相关文章

Ubuntu安装MySQL提示Depends: mysql-server-5.5 but it is not going

mysql-bin.00000* 文件误删删除导致mysql启动不起来

Linux screen 提示:There is no screen to be resumed matching

MySQL 上传报错#1064-You have an error in your SQL syntax

Linux 下 MySQL 无法访问的问题如何排查?

Linux下如何授权 MySQL 外网访问?

Linux系统如何查看 MySQL 版本号?

Ubuntu或Debian系统内如何卸载 MySQL 数据库服务?

MySQL误删除授权表 root 记录,无法登陆怎么办?

Linux 系统下 MySQL 如何开启慢查询?

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

他的文章

百万司机车货匹配项目 从 300qps 至 3000qps 的优化之路

PostgreSQL 9.6.0 在线中文手册下载

postgresSQL可视化客户端Navicat for PostgreSQL

全文搜索引擎 ElasticSearch 入门教程

一波 navicat在线手册来袭!

微信含emoji表情昵称入库失败:HY000,1366, Incorrect string value

postman share Collection Get link出错

介绍 mysql 中的 character set 与 collation

介绍一款linux多线程下载工具axel(用以替代wget)

mysql命令行如何一次添加添加多个字段(列) 索引?

手机扫一扫
分享文章