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字符集

mysqlutf8假的uft8,mysql的utf8mb4才是真的uft8.


一般系统推荐的字符集和排序规则

image.png

字符集(Character Set):utf8mb4
排序规则|字符序(Collate):utf8mb4_general_cliutf8mb4_bin
存储引擎:InnoDB


utf8:

mysqlUTF-8字符最大只支持3个字节,只包含了大多数字符但并不是所有,而emoji和一些不常用的汉字,如“墅”,这些需要四个字节才能编码的就不支持。


utf8mb4:

5.5.3版本之后增加了utf8mb4编码,mb4就是most bytes 4的意思,专门用来兼容四字节unicode,与之前的3字节utf8字符集相比,可用性更高。

但相对于utf8来说,字节变多,数据库体积也就会变得更大,官方强烈推荐使用varchar而不要使用char,这样可以让字段有更好的伸缩性,从而稍微缓解一下空间消耗的问题。


MYSQL字符序

在这里插入图片描述
在这里插入图片描述
除了字符集,还有一个排序规则,在mysql中还有排序字符集(字符序)的概念,对应上图中的排序规则,而在每张表的详细信息中,也可以看到这个排序规则,如果没有特殊指定,就会跟数据库保持一致.

而这个排序规则,在不同字符集下的写法也不一样,如果字符集是utf8,那么排序规则就是utf8_general_ciutf8_unicode_ci;如果字符集是utf8mb4,那么排序规则就是utf8mb4_general_ciutf8mb4_unicode_ci

其实区别也不大,每一种字符集都对应的有general_ciunicode_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
### UTF8MB4_UNICODE_CIUTF8MB4_GENERAL_CI 的差异 在 MySQL 中,`utf8mb4_unicode_ci` 和 `utf8mb4_general_ci` 是两种不同的排序规则(collation),用于处理字符集 `utf8mb4` 下字符串的比较和排序。 #### 字符串比较准确性 `utf8mb4_unicode_ci` 排序规则基于 Unicode 标准实现更严格的语言敏感性。这种排序方式考虑到了更多复杂的语言特性,如重音符号、变音符号和其他特殊字符的区别[^1]。因此,在多语言环境中特别是对于欧洲语言的支持更为精准。 相比之下,`utf8mb4_general_ci` 则采用了较为宽松的方式来进行字符匹配与排序操作。它忽略了某些细节上的差别,比如不同形式的字母可能被视为相同对待;这使得其性能通常优于前者但在特定情况下可能会丢失一些细微的语言特征[^2]。 #### 性能表现 由于 `utf8mb4_unicode_ci` 需要执行更加细致入微的文字分析工作来确保正确无误地识别各种文字形态及其含义关联,所以在实际应用过程中往往伴随着更高的计算成本以及相对较慢的速度体验。而另一方面,`utf8mb4_general_ci` 因为其简化了部分逻辑判断流程从而获得了更好的效率优势[^3]。 ```sql SELECT 'é' = 'e' COLLATE utf8mb4_unicode_ci AS unicode_result, 'é' = 'e' COLLATE utf8mb4_general_ci AS general_result; ``` 上述 SQL 查询展示了两个排序规则下对带重音符号的小写字母 "é" 与普通小写英文字母 "e" 进行相等性测试的结果对比情况: - 使用 `utf8mb4_unicode_ci` 返回 false 表明两者并不认为是相同的; - 而采用 `utf8mb4_general_ci` 则会返回 true 认定它们可以互换使用。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值