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
,什么提示也没有。