MySQL从入门到精通高级篇字符集的修改与底层原理

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL从入门到精通高级篇字符集的修改与底层原理相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556

文章目录

1. 简介

今天正式开始mysql的学习,基础部分的学习先跳过,直接进入高级部分的学习。本文主要参考B站中的MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!

2. 环境

环境版本
Red Hat4.8.5-39
MySQL5.7

3. 字符集

3.1. 修改字符集

首先需要介绍的就是字符集,MySQL 5.7 默认的字符集是latin1,在MySQL 8.0以后默认的字符集是utf8mb4。
latin1字符集的有个问题就是不能保存中文,所以需要修改服务器默认的字符集,只需要修改 /etc/my.cnf 文件,通过命令vim /etc/my.cnf打开配置文件,在该文件中添加如下配置:

character-set-server=utf8


添加完该配置之后重启MySQL服务器。

systemctl restart mysqld.service

3.2. 查看系统字符集

首先需要通过mysql -u[用户名] -p[密码] (例如:mysql -uroot -pmysql)进入到mysql命令行,接着通过如下命令可以查看MySQL服务器的字符集编码:

show variables like '%character%';


其中:

  1. character_set_client:服务器解码请求时使用的字符集
  2. character_set_connection: 服务器处理请求时会把请求字符串从character_set_client转character_set_connection
  3. character_set_database: 当前数据库的字符集
  4. character_set_server: 服务器级别的字符集
  5. character_set_results: 服务器香客户端返回数据时使用的字符集。
    其中:服务器级别的字符集和当前数据库的字符集可能不一样。

3.3. 查看数据库的字符集

show create database [数据库名];

3.3.1. 修改数据库的字符集

alter database [数据库] character set [字符集名称];

3.4. 查看数据表的字符集

#修改数据表字符集
alter table [数据表] character set [字符集名称];
#查看数据表字符集
show create database [数据库名];

4. 各级别的字符集

MySQL有4个级别的字符集和比较规整,分别是:

  1. 服务器级别:由character_set_server指定
  2. 数据库级别:数据库级别的字符集默认跟随服务器级别的字符集,也可以自行指定不同的字符集
  3. 表级别:表级别的字符集默认跟随数据库级别的字符集,也可以自行指定不同的字符集
  4. 列级别:列级别的字符集默认根据表级别的字符集,也可以自行指定不同的字符集

4.1. 服务器级别

character_set_server: 服务器级别的字符集
我们可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用set语句修改这两个变量的值,比如我们可以在配置文件/etc/my.cnf中这样写:

character-set-server=utf8
collation-server=utf8_unicode_ci

4.2. 数据库级别

character_set_database : 当前数据库的字符集
我们在创建和修改数据库的时候可以指定字符集和比较规则,具体的语法如下:

CREATE DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
	[[DEFAULT] COLLATE 比较规则名称]
	
ALTER DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
	[[DEFAULT] COLLATE 比较规则名称]

其中的DEFAULT 可以省略,并不影响语句的语义,比如:

mysql> create database demodb1
    -> character set utf8
    -> collate utf8_unicode_ci;
Query OK, 1 row affected (0.01 sec)

4.3. 表级别

我们也可以在创建和修改表的时候指定表的字符集和比较规则,语法如下:

CREATE TABLE 表名(列的信息)
    [[DEFAULT] CHARACTER SET 字符集名称]
	[[DEFAULT] COLLATE 比较规则名称]
	
ALTER TABLE 表名(列的信息)
    [[DEFAULT] CHARACTER SET 字符集名称]
	[[DEFAULT] COLLATE 比较规则名称]

创建表与创建数据库类似,其中DEFAULT也可以省略。比如;

mysql> create table t1(id int,name varchar(50))
    -> character set utf8mb4
    -> collate utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.01 sec)

4.4. 列级别

对于存储字符串的列,同一个表中的不同列也可以有不同的字符集和比较规则,我们在创建和修改列定义的时候可以指定该列的字符集和比较规则,语法如下:

CREATE TABLE 表名(
  列名 字符串类型 [CHARACTER SET 字符集名称][COLLATE 比较规则名称],
  其他列....
)
ALTER TABLE 表名 MODIFY COLUMN 列名 字符串类型 [CHARACTER SET 字符集名称][COLLATE 比较规则名称];

比如我们修改一下表 t1 中列id的字符集合比较规则可以这么写:

ALTER TABLE t1 MODIFY COLUMN `id` int(11)  CHARACTER SET utf8 COLLATE utf8_unicode_ci;

最佳的实践是:设定服务器级别的编码是utf8即可,数据库以及数据表保持一致。

5. 字符集与比较规则

5.1. utf8与utf8mb4

utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3 个字节就可以表示了,而字符集表示一个字符所用的最大字节长度,在某些方面会影响系统的存储和性能,所以涉及MySQL的设计者偷偷定义了两个概念:

  1. utf8mb3 : 阉割过的utf8字符集,只使用1~3 个字节表示字符
  2. utf8mb4: 正宗的utf8字符集,使用1~4个字节表示字符。
    在MySQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节表示一个字符。如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情,那么请使用utf8mb4
    通过如下指令可以查看MySQL支持的字符集:
SHOW CHARSET;

5.2. 比较规则

上表中,MySQL版本一共支持41种字符集,其中的Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如:utf8_polish_ci 表示以波兰语的规则比较,utf8_general_ci 是一种通用的比较规则。
后缀表示该比较规则是否区分语言中的重音,大小写,具体如下:

后缀英文释义描述
_aiaccent insensitive不区分重音
_asaccent sensitive区分重音
_cicase insensitve不区分大小写
_cscase sensitive区分大小写
_binbinary以二进制方式比较

最后一列Maxlen,它代表该种字符集表示一个字符最多需要几个字节。

字符集名称Maxlen
ascill1
latin11
gb23122
gbk2
utf83
utf8mb44

常用操作:

#查看gbk字符集的比较规则
SHOW COLLATION LIKE 'gbk%'
#查看utf8字符集的比较规则
SHOW COLLATION LIKE 'utf8%'

总结

本文还是一篇基础文,详细介绍了MySQL中的字符集以及比较规则。

以上是关于MySQL从入门到精通高级篇字符集的修改与底层原理的主要内容,如果未能解决你的问题,请参考以下文章

MySQL从入门到精通高级篇MySQL用户的创建_修改_删除以及密码的设置

MySQL从入门到精通高级篇MySQL用户的创建_修改_删除以及密码的设置

MySQL从入门到精通高级篇MySQL表的存储引擎,InnoDB与MyISAM的对比

MySQL从入门到精通高级篇MySQL权限管理与控制

MySQL从入门到精通高级篇MySQL权限管理与控制

1024程序员节|MySQL从入门到精通高级篇(二十七)外连接和内连接如何进行查询优化呢?join的原理了解一波