MySQL 字符集相关梳理
故事背景
今天在做项目数据迁移,涉及到将 A 表中的某个字段复制到 B 表,本地(MAC Mysql 8.0.25)完全没问题,但是在服务器上执行迁移文件时报错:
经过一番查阅资料发现是由于 emoji 字符导致的,由于服务器中 Mysql 版本为 5.6 在 A 表中设置的字符集为 utf8mb4 而 B 表中默认使用 utf8,utf8 最大只支持三个字节,而 emoji 表情字节占用大于三个,因此导入失败。下面关于 MySQL 字符相关做如下梳理:
MySQL 字符集
版本与字符集
MySQL5.5 版本在 my.ini 上修改 character_set_server 为 utf8
MySQL8.0 以上版本默认 character_set_server 为 utf8mb4
utf8mb4 和 utf8 的区别
-
utf8mb4 是 utf8 的扩展版,支持更多的字码形式
-
utf8mb4 最大支持 4 个字节,utf8 最大支持三个字节
其他编码问题
ASCII 编码:一个英文字母(不区分大小写)占用一个字节的空间,一个中文汉字占用两个字节的空间。一个二进制的数字序列,在计算机中作为一个数字单元存储是,一般为 8 位二进制,换算为十进制,最小值0,最大值255
UTF-8:一个英文字符占用一个字节的存储空间,一个中文(含繁体)占用三个字节的存储空间。
Unicode(万国码):一个英文占用两个字节的存储空间,一个中文(含繁体)占用两个字节的存储空间
UTF-16:一个英文字符或一个汉字字符存储都需要占用两个字节的存储空间
UTF-32L:在世界上任何字符的存储都需要占用4个字节的存储空间
Mysql 查看和修改数据库字符集方法
查看字符集
- 查看 Mysql 数据库服务器和数据库字符集
# 方法一:查看数据库字符集
show variables like