字符集问题

概述

MySQL8.0与MySQL5.7的字符集对比

MySQL5.7

MySQL8.0

默认字符集:latin1

默认编码:utf8mb4

utf8 与 utf8mb4

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

utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符,MySQL5.7中的utf8就是指utf8bm3

utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

查询MySQL5.7中的各模块字符集

MySQL数据库默认字符集改了又恢复了 mysql默认字符集编码是什么_数据库

查询MySQL8.0中的各模块字符集

MySQL数据库默认字符集改了又恢复了 mysql默认字符集编码是什么_mysql_02

一、在MySQL5.7中修改字符集

在/etc/my.cnf文件内修改字符集

MySQL数据库默认字符集改了又恢复了 mysql默认字符集编码是什么_数据库_03

设置后要重启mysql服务
systemctl restart mysqld.service
查看修改后的字符集情况

MySQL数据库默认字符集改了又恢复了 mysql默认字符集编码是什么_服务器_04

修改字符集后,再创建新的数据库及该数据库内数据表,里面的数据默认字符集就是utf8

注意:已经创建的数据库、数据表,以及再原先数据库内创建新的数据表,其字符集还是latin1,不会改变

二、已有库&表的字符集的变更

已有数据库的字符集变更
alter database dbtest1 character set 'utf8';

MySQL数据库默认字符集改了又恢复了 mysql默认字符集编码是什么_database_05

已有数据表的字符集变更

MySQL数据库默认字符集改了又恢复了 mysql默认字符集编码是什么_服务器_06

三、各级别的字符集

级别划分

① 服务器级别

在/etc/my.cnf文件中修改

② 数据库级别

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

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

③ 表级别

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

ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]

④ 列级别

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

ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
具体各模块的字符集

show variables like ‘character%’

名称

1

character_set_server

服务器级别的字符集

2

character_set_database

当前数据库的字符集

3

character_set_client

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

4

character_set_connection

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

转为character_set_connection

5

character_set_results

服务器向客户端返回数据时使用的字符集

请求到相应过程中的字符集的变化(了解就ok)

① 客户端发送和接收请求所使用的字符集要和当前操作系统一致,即和character_set_client,character_set_results保持一致。

② 不同操作系统使用的字符集可能不一 样,

类 Unix 系统使用的是 utf8

Windows 使用的是 gbk

③ character_set_connection可以与发送/接收请求的字符集不一样,它只起到中间转换作用