原文网址:https://www.youyong.top/article/11597aef9f4e1
最近日志中发现,如下错误:
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 ...
原文网址:https://www.youyong.top/article/11597aef9f4e1
最近日志中发现,如下错误:
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 ...
原文网址:https://www.youyong.top/article/11597aef9f4e1
定位发现是微信用户表插入失败,网上查到是因为微信昵称中包含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的好。
以下内容参考这篇文章,略有调整。
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_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 |
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;
共 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
iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评
资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样
百万司机车货匹配项目 从 300qps 至 3000qps 的优化之路
postgresSQL可视化客户端Navicat for PostgreSQL
微信含emoji表情昵称入库失败:HY000,1366, Incorrect string value
postman share Collection Get link出错
介绍 mysql 中的 character set 与 collation
手机扫一扫
分享文章