在一些场景中,比如微信的头像,用户的昵称,订单评价,留言等等,都可能会用到表情,支持表情存储在当今的系统设计中成了一个最基础的功能点。mysql数据库的默认字符集utf8,只能存储3个字节的数据。标准的emoji表情是4个字节。
如果你的数据库不支持表情,那么在插入数据库时会报错:
[HY000][1366] Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...'
for column 'comment' at row 1
解决方式:
- 更换字符集utf8–>utf8mb4 mb4的意思是most bytes 4,专门为兼容四个字节的。utf8mb4是向下兼容utf8的,所以即便修改了字段的字符集也不会影响线上数据。
- 修改my.conf 这种方式需要重启数据库
环境:基于mysql5.6,Mysql 版本的限制,Mysql 5.5.3之前的版本,支持的utf8为3字节的,Mysql 5.5.3之后的版本支持utf8mb4
方案1
步骤:
修改表字段编码和字符集
ALTER table table_name modify file_name varchar(100) character
set utf8mb4 collate utf8mb4_unicode_ci
修改表的编码格式
ALTER table table_name convert to character set utf8mb4 collate utf8mb4_bin;
修改数据库的编码
mysql> set names utf8mb4;
Query OK, 0 rows affected (0.00 sec)
修改后可看到字符集设置
mysql> 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 | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | utf8mb4_general_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
不需要重启数据库
方案2
修改my.conf文件,打开配置文件,在响应的节点追加以下内容:
[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'
如果是docker创建的容器怎么办呢?答案也是一样的,需要进入docker容器里面(如何进入,请查看docker常用知识点学习)修改my.conf,不过在修改之前需要先安装vim,因为docker默认是没有安装vim的,安装命令:
apt-get install vim
有时候会提示
root@50100b26ab35:/# apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
这时候需要更新资源目录,命令是:
apt-get update
这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
docker 中的mysql启动脚本一般在/etc/init.d/mysql
修改完之后重启数据库就Ok了。
方案3
如果采用docker的方式创建数据,那么可以在创建容器的时候指定初始化编码。
version: '2'
services:
mysql:
image: mysql:5.7.16
ports:
- ${DB_PORT}:3306
environment:
- TZ=Asia/Shanghai
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./mysql_data:/var/lib/mysql
restart: unless-stopped