当前位置:   article > 正文

MySQL字符集utf8、utf8mb4、utf8mb4_general_ci、utf8mb4_unicode_ci的区别_utf8mb4 general ci

utf8mb4 general 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.csdn.net/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

# 创建新表时使用的默认字符集
default-character-set=utf8mb4

# 建议禁用符号链接以防止各种安全风险
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

MYSQL8

在MYSQL8中,默认的字符集将会被更改为 utf8mb4,同时在未来的版本中可能会删除 utf8mb3 字符集,尽管目前 utf8 仍然会指向 utf8mb3,但是任然不建议显示使用,尽量使用 utf8mb4

-- 查看数据库的编码格式
show create database 数据库名;
  • 1
  • 2

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述


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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

删除原数据文件,重启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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在这里插入图片描述

# 查看数据目录权限--正常的
ls -ld /var/lib/mysql

# 重新赋予datadir 属主和属组
## 给予权限后重启正常了
chown -R mysql:mysql /var/lib/mysql

# 重启mysqld服务
systemctl restart mysqld
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/858543
推荐阅读
相关标签
  

闽ICP备14008679号