MySQL字符集utf8、utf8mb4、utf8mb4_general_ci、utf8mb4_unicode_ci的区别
为什么不建议在MySQL中使用UTF-8
在MySQL中,utf8编码只支持每个字符最多三个字节,而真正的UTF-8 是每个字符最多四个字节。
MySQL 的“utf8mb4”才是真正的“UTF-8”。
MySQL 的“utf8”实际上不是真正的 UTF-8,插入emoji文字时会报错;
MySQL 的“utf8mb4”才是真正的“UTF-8”。
https://mp.weixin.qq.com/s/xHb08kPEfvBiXw08kJ3Lrw
MYSQL字符集
mysql的utf8是假的uft8,mysql的utf8mb4才是真的uft8.
一般系统推荐的字符集和排序规则

字符集(Character Set):utf8mb4
排序规则|字符序(Collate):utf8mb4_general_cli或utf8mb4_bin
存储引擎:InnoDB
utf8:
mysql的UTF-8字符最大只支持3个字节,只包含了大多数字符但并不是所有,而emoji和一些不常用的汉字,如“墅”,这些需要四个字节才能编码的就不支持。
utf8mb4:
在5.5.3版本之后增加了utf8mb4编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode,与之前的3字节utf8字符集相比,可用性更高。
但相对于utf8来说,字节变多,数据库体积也就会变得更大,官方强烈推荐使用varchar而不要使用char,这样可以让字段有更好的伸缩性,从而稍微缓解一下空间消耗的问题。
MYSQL字符序


除了字符集,还有一个排序规则,在mysql中还有排序字符集(字符序)的概念,对应上图中的排序规则,而在每张表的详细信息中,也可以看到这个排序规则,如果没有特殊指定,就会跟数据库保持一致.
而这个排序规则,在不同字符集下的写法也不一样,如果字符集是utf8,那么排序规则就是utf8_general_ci和utf8_unicode_ci;如果字符集是utf8mb4,那么排序规则就是utf8mb4_general_ci和utf8mb4_unicode_ci。
其实区别也不大,每一种字符集都对应的有general_ci和unicode_ci两种排序规则,那这两种排序规则有什么区别呢?
utf8mb4_unicode_ci:
基于标准的Unicode来排序和比较,能够在各种语言之间精确排序,在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法,所以兼容度比较高,但是性能不高。
utf8mb4_general_ci:
没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致,但是在比较和排序的时候速度更快。
MYSQL5.7创建数据库时指定字符集
参考来源:
https://www.jiweichengzhu.com/article/677cf71ca3064731a0b0b50bdf3b076c
https://juejin.cn/post/6997977636915904525
MYSQL5.7创建数据库时,建议默认字符集选择utf8mb4;
默认编码选择 utf8mb4_general_ci。
mysql5.7配置文件指定字符集为utf8mb4
https://docs.lvrui.io/2016/08/21/修改MySQL的字符集为utf8mb4/
https://blog.youkuaiyun.com/omaidb/article/details/120082063
修改Mysql5配置文件/etc/my.cnf
# 服务端配置
[mysqld]
# 数据保存路径
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 初始化连接时的字符集
#init_connect='SET NAMES utf8mb4'
# 客户端握手字符集
character-set-client-handshake=FALSE
# 服务端使用的默认字符集
character_set_server=utf8mb4
# 服务端使用的字符序
# https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html
collation-server=utf8mb4_uncode_cli
# 创建新表时使用的默认存储引擎
## https://www.runoob.com/w3cnote/mysql-different-nnodb-myisam.html
default-storage-engine=INNODB
# 建议禁用符号链接以防止各种安全风险
symbolic-links=0
# 错误日志路径--默认参数
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 对本地的mysql客户端的配置
[client]
# 创建新表时使用的默认字符集
default-character-set=utf8mb4
# 对其他远程连接的mysql客户端的配置
[mysql]
default-character-set=utf8mb4
MYSQL8
在MYSQL8中,默认的字符集将会被更改为 utf8mb4,同时在未来的版本中可能会删除 utf8mb3 字符集,尽管目前 utf8 仍然会指向 utf8mb3,但是任然不建议显示使用,尽量使用 utf8mb4。
-- 查看数据库的编码格式
show create database 数据库名;

-- 查看Mysql8默认编码格式
show variables like "char%";

-- 查看Mysql8默认编码格式
show variables like "character%";

MYSQL8配置文件指定字符集为utf8mb4
修改Mysql8配置文件/etc/my.cnf
# 服务端配置
[mysqld]
# 客户端握手不使用客户端指定的字符集,而使用server的字符集
## 能防止客户端和服务端字符集不一致导致的问题
character-set-client-handshake=FALSE
# 服务端使用的默认字符集
character-set-server=utf8mb4
# 服务端使用的字符序
# https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html
collation-server=utf8mb4_unicode_ci
# 不允许在数据目录中使用符号链接
## 使用符号链接,可能会导致 MySQL 的一些操作出现问题,比如备份和恢复数据时可能会出现错误。
symbolic-links=0
# 数据保存路径
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 日志保存路径
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 远程客户端配置
[mysql]
# 指定远程客户端默认使用 utf8mb4 字符集。
default-character-set=utf8mb4
# 对本地的mysql客户端的配置
[client]
# 指定本地客户端默认使用 utf8mb4 字符集。
default-character-set=utf8mb4
删除原数据文件,重启mysqld
https://www.cnblogs.com/jmxx/p/16268434.html
# 先停止mysqld服务
systemctl stop mysqld
# 删除原来的数据文件
rm -rf /var/lib/mysql/*
# 清空原日志
> /var/log/mysqld.log
# 执行mysql初始化
## 在 MySQL 数据目录中创建系统表和数据文件,并为 root 用户生成一个随机密码。
mysqld --initialize --console
# 查看默认密码
grep 'temporary password' /var/log/mysqld.log
# 重启mysqld服务
systemctl restart mysqld
# 如果重启报错,一般都是目录权限的问题
## 以root执行来mysql初始化而非mysql用户
## 一般是/var/lib/mysql/auto.cnf权限的问题
ls -alh /var/lib/mysql/auto.cnf

# 查看数据目录权限--正常的
ls -ld /var/lib/mysql
# 重新赋予datadir 属主和属组
## 给予权限后重启正常了
chown -R mysql:mysql /var/lib/mysql
# 重启mysqld服务
systemctl restart mysqld
1万+





