原因:
由于mysql默认编码为utf-8,最大只占3个字节,一些表情或者非常见字符,比如该例子中“xF0\x9F\x8C\xB8”占4个字节,这样往数据表里插入4个字节的数据就会出错。
解决办法:
将相应数据库和数据表的编码由utf8修改为utf8mb4。具体两者区别可以执行百度。
1.cd到 /etc/mysql/mysql.conf.d目录,修改目录下的mysqld.cnf文件,添加如下内容:
[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.重启MySQL使生效:
service mysql restart
这时我们在mysql命令行模式下使用命令【\s】就可以看到刚才设置的结果:
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper
Connection id: 7
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: less
Using outfile: ''
Using delimiter: ;
Server version: 5.7.22-0ubuntu0.16.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 2 hours 43 min 38 sec
Threads: 2 Questions: 114 Slow queries: 0 Opens: 193 Flush tables: 1 Open tables: 76 Queries per second avg: 0.011
3.修改数据库和数据表对应字段的编码格式(name自行替换):
(1)修改数据库编码方式
ALTER DATABASE name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
修改完可以使用如下命令查看修改结果:
show variables like 'character_set_database';
(2)修改数据表编码方式
ALTER TABLE name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改完可以使用如下命令查看修改数据表的结果:
show create table name
(3)修改数据表里字段的编码方式
事实上只要做到前两步就可以了
ALTER TABLE name CHANGE 'name' VARCHAR(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4.如果是使用Django等框架做数据库连接,注意还要在连接的配置文件中指定好编码格式,django的配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #数据库引擎
'NAME': '',# 数据库名,先前创建的
'USER': '',#用户名
'PASSWORD':'',
'HOST':'127.0.0.1',
'PORT':'3306',
'CHARSET':'utf8mb4', #特别注意这里
}
}