mysql字符集和字符序

1 概念

字符集:mysql 数据字符编码方式
字符序:mysql 数据字符排序的方式

2 字符集类型和大小

字符集类型:latin1,gbk,utf8,utf8mb4 四种类型
字符集大小:Latin(1byte),gbk(2byte),utf8(<3byte),utf8mb4(<4byte)

3 mysql涉及的字符集

mysql字符集和字符序
character_set_client:客户端请求数据的字符集
character_set_connection:客户机/服务器连接的字符集
character_set_database:数据库编码。
character_set_filesystem:把os上文件转化成此字符集,默认binary是不做任何转换的character_set_results:结果集,返回给客户端的字符集
character_set_server:数据库服务器的默认字符集,当没有指定列编码,表编码,数据库编码的时候,才能对所建的数据库或者表起作用,优先级最低。
character_set_system:系统字符集,描述数据库元数据的数据编码方式。

4 mysql 数据库中字符集转换流程

mysql字符集和字符序

5 MySQL数据库乱码原因解析及案例

1 编码解码不一致导致乱码

SET character_set_client = gbk; // 将 client 设为 gbk;
SET character_set_connection = gbk;
SET character_set_results = utf8;
ALTER TABLE test CONVERT TO CHARACTER SET utf8mb4; // 修改表的编码为 utf8mb4;
Cmd 命令中是 gbk,解码异常

cmd窗口 gbk -> Client gbk -> connection gbk -> server(test表) utf8mb4
-> connection gbk -> result utf8 -> cmd 窗口 gbk
原因: result 字符集以 utf8 编码,cmd 窗口以 gbk 解码,出现乱码

2 节码,丢失信息

SET character_set_client = gbk; // 将 client 设为 gbk;
SET character_set_connection = latin1;
SET character_set_results = utf8;
ALTER TABLE test CONVERT TO CHARACTER SET utf8mb4; // 修改表的编码为 utf8mb4;

cmd窗口 gbk -> Client gbk -> connection latin1 -> server(test表) utf8mb4
-> connection gbk -> result gbk -> cmd窗口 gbk
原因:gbk 字符集范围大于latin1 ,latin1 无法表示 gbk 中部分中文

6 mysql 中utf8,utf8mb4, gbk, latin1字符的介绍

字符集范围 utf8mb4(最大四字节) > utf8(最大三字节) > gbk(两字节) > latin1 (一字节)
UTF-8就是在互联网上使用最广的一种unicode的实现方式。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~3个字节表示一个符号,根据不同的符号而变化字节长度。
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
Utf8mb4是一种扩展的utf8, 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。Utf8mb4包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312<=>Unicode<=>UTF8

Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。

7 utf8升级utf8mb4

1 修改库,表,字段

查看mysql 编码
SHOW create database database_name; // 查看数据库编码方式
SHOW create table table_name;
SHOW FULL COLUMNS FROM table_name; // 查看字段编码方式
show variables like ‘%character%’; // 查看字符集信息
1 # 修改数据库:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
2 # 修改表:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
3 # 修改表字段(没有必要,表字符集修改之后,表中字段字符集默认修改):
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

2 修改配置文件

修改server, connection, client 等character set ,windows 下修改 my.ini 配置文件
Linux 下修改 my.cnf 文件 ,配置内容大致如下(参考价值):
[client]
default-character-set = utf8mb4
[mysql]
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.
default-character-set = utf8mb4
[mysqld]
# The default character set that will be used when a new schema or table is
# created and no character set is defined
character-set-client-handshake = True
# 设置为 False, 在客户端字符集和服务端字符集不同的时候将拒绝连接到服务端执行任何操
# 设置为 True, 在客户端字符集和服务端字符集不同的时候可以连接到服务端执行任何操
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# 是用户登录到数据库上之后, 在执行第一次查询之前执行里面的内容. 如#果 init_connect 的内容有语法错误, 导致执行失败, 会导致用户无法执行查询, 从mysql 退出
init_connect=’SET NAMES utf8mb4’

8 字符序命名以及与字符集的关系

1 MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;
以_ci(表示大小写不敏感);
_cs(表示大小写敏感);
_bin(表示按编码值比较)结尾。
例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

2 一个字符集对应至少一种字符序(一般是1对多)。
两个不同的字符集不能有相同的字符序。
每个字符集都有默认的字符序。

3 utf8mb4的 collation_name
mysql字符集和字符序

常用的有 utf8_unicode_ci和 utf8_general_ci
utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。