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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 今天正式开始MySQL的学习,基础部分的学习先跳过,直接进入高级部分的学习。本文主要参考B站中的MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!

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打开配置文件,在该文件中添加如下配置:

character-set-server=utf8

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

systemctl restart mysqld.service

3.2. 查看系统字符集

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

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. 查看数据库的字符集

show create database [数据库名];

3.3.1. 修改数据库的字符集

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

3.4. 查看数据表的字符集

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

4. 各级别的字符集

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

服务器级别:由character_set_server指定

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

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

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

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 是一种通用的比较规则。

后缀表示该比较规则是否区分语言中的重音,大小写,具体如下:

后缀 英文释义 描述
_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

常用操作:

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

总结

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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
8月前
|
自然语言处理 搜索推荐 关系型数据库
MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享
本文介绍了在文档管理系统中实现高效全文搜索的方案。为解决原有ES搜索引擎私有化部署复杂、运维成本高的问题,我们转而使用MySQL实现搜索功能。通过对用户输入预处理、数据库模糊匹配、结果分段与关键字标红等步骤,实现了精准且高效的搜索效果。目前方案适用于中小企业,未来将根据需求优化并可能重新引入专业搜索引擎以提升性能。
363 5
|
10月前
|
SQL 关系型数据库 MySQL
网安入门之MySQL后端基础
《网安入门之MySQL后端基础》简介: 本文介绍了数据库及MySQL的基础知识,涵盖数据库的概念、结构与操作。数据库是组织化存储数据的集合,通过表、列、行等结构实现高效管理。MySQL作为开源的关系型数据库管理系统,广泛应用于Web开发。文中详细讲解了MySQL的基本操作,如增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)等语句的使用方法,并介绍了数据库事务的ACID特性。此外,还探讨了SQL注入攻击的风险及防范措施,强调了预处理语句的重要性。最后,简述了PHP中mysqli扩展的使用方法,包括连接数据库、执行查询和关闭连接等步骤。
|
4月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
7月前
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
1685 26
|
10月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
2507 82
|
9月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
501 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
8月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
9月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
911 11
|
9月前
|
存储 缓存 关系型数据库
MySQL进阶突击系列(08)年少不知BufferPool核心原理 | 大哥送来三条大金链子LRU、Flush、Free
本文深入探讨了MySQL中InnoDB存储引擎的buffer pool机制,包括其内存管理、数据页加载与淘汰策略。Buffer pool作为高并发读写的缓存池,默认大小为128MB,通过free链表、flush链表和LRU链表管理数据页的存取与淘汰。其中,改进型LRU链表采用冷热分离设计,确保预读机制不会影响缓存公平性。文章还介绍了缓存数据页的刷盘机制及参数配置,帮助读者理解buffer pool的运行原理,优化MySQL性能。

推荐镜像

更多