赞
踩
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
的utf8
是假的uft8
,mysql的utf8mb4
才是真的uft8
.
字符集(Character Set
):utf8mb4
排序规则|字符序(Collate
):utf8mb4_general_cli
或utf8mb4_bin
存储引擎:InnoDB
mysql
的UTF-8字符
最大只支持3个字节
,只包含了大多数字符但并不是所有,而emoji
和一些不常用的汉字
,如“墅”,这些需要四个字节
才能编码的就不支持。
在5.5.3
版本之后增加了utf8mb4
编码,mb4
就是most bytes 4
的意思,专门用来兼容四字节
的unicode
,与之前的3字节utf8字符集
相比,可用性更高。
但相对于utf8
来说,字节变多
,数据库体积也就会变得更大,官方强烈推荐使用varchar
而不要使用char
,这样可以让字段有更好的伸缩性,从而稍微缓解一下空间消耗的问题。
除了字符集
,还有一个排序规则
,在mysql
中还有排序字符集(字符序)
的概念,对应上图
中的排序规则
,而在每张表的详细信息中,也可以看到这个排序规则
,如果没有特殊指定
,就会跟数据库保持一致
.
而这个排序规则
,在不同字符集下的写法也不一样,如果字符集是utf8
,那么排序规则就是utf8_general_ci
和utf8_unicode_ci
;如果字符集是utf8mb4
,那么排序规则就是utf8mb4_general_ci
和utf8mb4_unicode_ci
。
其实区别也不大,每一种字符集都对应的有general_ci
和unicode_ci
两种排序规则,那这两种排序规则有什么区别呢?
基于标准
的Unicode
来排序
和比较
,能够在各种语言之间精确排序
,在特殊情况下,Unicode
排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法,所以兼容度比较高
,但是性能不高
。
没有
实现Unicode排序规则
,在遇到某些特殊语言
或者字符集,排序结果可能不一致
,但是在比较和排序的时候速度更快
。
参考来源:
https://www.jiweichengzhu.com/article/677cf71ca3064731a0b0b50bdf3b076c
https://juejin.cn/post/6997977636915904525
MYSQL5.7创建数据库时,建议
默认字符集
选择utf8mb4
;
默认编码
选择 utf8mb4_general_ci
。
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
在MYSQL8中,默认的字符集将会被更改为 utf8mb4
,同时在未来的版本中可能会删除 utf8mb3
字符集,尽管目前 utf8
仍然会指向 utf8mb3
,但是任然不建议显示使用,尽量使用 utf8mb4
。
-- 查看数据库的编码格式
show create database 数据库名;
-- 查看Mysql8默认编码格式
show variables like "char%";
-- 查看Mysql8默认编码格式
show variables like "character%";
修改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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。