MySQL: Incorrect string value: '\xF0\xA6***' for column 'name' at row 1

mysql 报错:

 Incorrect string value: '\xF0\xA6***' for column 'name' at row 1 

场景:插入某些生僻字,或者 emoji 表情字符的时候报错。网上的方案都是使用 utf8mb4。但是 show create table 显示已经是 utf8mb4 了。

也曾以为是列编码的问题,单独列编码也不好使。

很诡异的是,一台服务器没问题,另一台就不行。配置文件都是一样的,jdbc 连接字符串也都是一样的。mysql 配置文件:

#
# this file will be installed only once.
#
# to upgrade this file, install or change it manually.
#
# reason: customer may change it according to their environment or requirement. customized params will be lost in automatically upgrade.
#

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]

# disable_ssl
skip_ssl

skip-host-cache
skip-name-resolve

bind-address=0.0.0.0

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

max_connections = 2000
tmp_table_size = 629145600

local-infile = 0

# myisam_sort_buffer_size = 10G
# log-error=/var/log/mysql/error.log

##################################################
## to clear log bin, run: RESET MASTER;
##################################################
# server-id=1
# log-bin=/var/log/jinghuasoft/mysql-bin

甚至是同一台服务器,以前没问题,现在就有问题(数据库中有存进去的数据,再修改就会报错)。

花了很长时间逐项比较,发现 show variables like '%char%' 输出不一样。有问题的数据库 character_set_server 显示还是 latin1。再继续比较,发现 /etc/mysql/conf.d/docker.cnf 内容虽然一样,权限不一样,一个是 644,一个不是。

root@xxx:/etc/mysql# ls -l conf.d/
total 12
-rwxr-x--- 1 root root 761 Feb 28 00:59 docker.cnf
-rw-r--r-- 1 root root   8 Aug  3  2016 mysql.cnf
-rw-r--r-- 1 root root  55 Aug  3  2016 mysqldump.cnf

难不成是文件权限的原因?改成 644:

chmod 644 /etc/mysql/conf.d/docker.cnf

重启,果然就好了。

又复查了下 docker logs mysql,什么提示也没有。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容