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

2022-12-08 21:34:55 浏览数 (1)

1. 简介

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

2. 环境

环境

版本

Red Hat

4.8.5-39

MySQL

5.7

3. 字符集

3.1. 修改字符集

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

代码语言:javascript复制
character-set-server=utf8

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

代码语言:javascript复制
systemctl restart mysqld.service

3.2. 查看系统字符集

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

代码语言:javascript复制
show variables like '%character%';

其中:

character_set_client:服务器解码请求时使用的字符集

character_set_connection: 服务器处理请求时会把请求字符串从character_set_client转character_set_connection

character_set_database: 当前数据库的字符集

character_set_server: 服务器级别的字符集

character_set_results: 服务器香客户端返回数据时使用的字符集。其中:服务器级别的字符集和当前数据库的字符集可能不一样。

3.3. 查看数据库的字符集

代码语言:javascript复制
show create database [数据库名];

3.3.1. 修改数据库的字符集

代码语言:javascript复制
alter database [数据库] character set [字符集名称];

3.4. 查看数据表的字符集

代码语言:javascript复制
#修改数据表字符集
alter table [数据表] character set [字符集名称];
#查看数据表字符集
show create database [数据库名];

4. 各级别的字符集

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

服务器级别:由character_set_server指定

数据库级别:数据库级别的字符集默认跟随服务器级别的字符集,也可以自行指定不同的字符集

表级别:表级别的字符集默认跟随数据库级别的字符集,也可以自行指定不同的字符集

列级别:列级别的字符集默认根据表级别的字符集,也可以自行指定不同的字符集

4.1. 服务器级别

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

代码语言:javascript复制
character-set-server=utf8
collation-server=utf8_unicode_ci

4.2. 数据库级别

character_set_database : 当前数据库的字符集 我们在创建和修改数据库的时候可以指定字符集和比较规则,具体的语法如下:```sql CREATE DATABASE 数据库名 [[DEFAULT] CHARACTER SET 字符集名称] [[DEFAULT] COLLATE 比较规则名称]

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

代码语言:javascript复制
其中的DEFAULT 可以省略,并不影响语句的语义,比如:
```sql
mysql> create database demodb1
    -> character set utf8
    -> collate utf8_unicode_ci;
Query OK, 1 row affected (0.01 sec)

4.3. 表级别

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

代码语言:javascript复制
CREATE TABLE 表名(列的信息)
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称]

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

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

代码语言:javascript复制
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. 列级别

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

代码语言:javascript复制
CREATE TABLE 表名(
  列名 字符串类型 [CHARACTER SET 字符集名称][COLLATE 比较规则名称],
  其他列....
)
ALTER TABLE 表名 MODIFY COLUMN 列名 字符串类型 [CHARACTER SET 字符集名称][COLLATE 比较规则名称];

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

代码语言:javascript复制
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的设计者偷偷定义了两个概念:

utf8mb3 : 阉割过的utf8字符集,只使用1~3 个字节表示字符

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

代码语言:javascript复制
SHOW CHARSET;

5.2. 比较规则

上表中,MySQL版本一共支持41种字符集,其中的Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如:utf8_polish_ci 表示以波兰语的规则比较,utf8_general_ci 是一种通用的比较规则。后缀表示该比较规则是否区分语言中的重音,大小写,具体如下:| 后缀 | 英文释义 | 描述| |--|--|--| | _ai | accent insensitive | 不区分重音 | | _as | accent sensitive | 区分重音 | | _ci |case insensitve | 不区分大小写| | _cs |case sensitive | 区分大小写| | _bin | binary |以二进制方式比较 |

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

字符集名称

Maxlen

ascill

1

latin1

1

gb2312

2

gbk

2

utf8

3

utf8mb4

4

常用操作:

代码语言:javascript复制
#查看gbk字符集的比较规则
SHOW COLLATION LIKE 'gbk%'
#查看utf8字符集的比较规则
SHOW COLLATION LIKE 'utf8%'

总结

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

0 人点赞