当前位置:网站首页>【MySQL从入门到精通】【高级篇】(一)字符集的修改与底层原理
【MySQL从入门到精通】【高级篇】(一)字符集的修改与底层原理
2022-06-24 07:07:00 【码农飞哥】
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
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 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的设计者偷偷定义了两个概念:
utf8mb3: 阉割过的utf8字符集,只使用1~3个字节表示字符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中的字符集以及比较规则。
边栏推荐
- Earthly container image construction tool -- the road to dream
- Introduction to data platform
- Blue screen error UNMOUNTABLE boot volume of the solution
- Increase insert speed
- There was an error checking the latest version of pip
- There was an error checking the latest version of pip
- 第七章 操作位和位串(三)
- 【生活思考】计划与自律
- Building a static website with eleventy
- 【量化投资】离散傅里叶变换求数组周期
猜你喜欢

分布式 | 如何与 DBLE 进行“秘密通话”

A tip to read on Medium for free

Liunx Mysql安装

pymysql 向MySQL 插入数据无故报错

Distributed | how to make "secret calls" with dble
![[explain the difference between operation and maintenance and network engineering]](/img/2b/945f468588e729336e2e973e777623.jpg)
[explain the difference between operation and maintenance and network engineering]
![Jenkins is deployed automatically and cannot connect to the dependent service [solved]](/img/fe/f294955a9bdf7492aab360e44e052d.png)
Jenkins is deployed automatically and cannot connect to the dependent service [solved]

Why can ping fail while traceroute can

OpenCV每日函数 结构分析和形状描述符(7) 寻找多边形(轮廓)/旋转矩形交集

Base64编码详解及其变种(解决加号在URL变空格问题)
随机推荐
Scheduled database backup script
日本大阪大学万伟伟研究员介绍基于WRS系统机器人的快速集成方法和应用
Use cpulimit to free up your CPU
orb slam build bug: undefined reference to symbol ‘_ZN5boost6system15system_categoryEv‘
String转Base64
K8S部署高可用postgresql集群 —— 筑梦之路
leetcode 1642. Furthest Building You Can Reach(能到达的最远的建筑)
项目部署相关
Earthly 容器镜像构建工具 —— 筑梦之路
dataX使用指南
It is enough to read this article about ETL. Three minutes will let you understand what ETL is
【量化投资】离散傅里叶变换求数组周期
数据中台:数据采集和抽取的技术栈详解
Liunx Mysql安装
Detailed explanation of Base64 coding and its variants (to solve the problem that the plus sign changes into a space in the URL)
Using ngrok for intranet penetration
Rust procedure macro simply imitates Lombok function
Mysql数据(Liunx环境)定时备份
關於ETL看這篇文章就够了,三分鐘讓你明白什麼是ETL
图片工具