第三章:乱码地前世今生:字符集和比较规则


字符集和比较规则

字符集简介

在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系
一个字符集包括:字符范围和编码规则

比较规则简介

对于某一种字符集来说,比较两个字符大小的规则可以制定出很多种,也就是说同一种字符集可以有多种比较规则

常用重要字符集

1、ASCII字符集 128个字符
2、ISO 8859-1字符集 256个字符
3、GB2312字符集 兼容ASCII字符集
如果该字符在 ASCII 字符集中,则采用1字节编码。
否则采用2字节编码
这种表示一个字符需要的字节数可能不同的编码方式称为 变长编码方式
4、GBK字符集
GBK 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312 。
5、utf8字符集
这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节其实准确的说,utf8只是Unicode字符集的一种编码方案,Unicode字符集可以采用utf8、utf16、utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个字符,utf32使用4个字节编码一个字符

Mysql中支持的字符集和排序规则

mysql中地utf8和utfbmb4

在 MySQL 中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计MySQL 的大叔偷偷的定义了两个概念
utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符
在 MySQL 中 utf8 是 utf8mb3 的别名

字符集地查看

查看当前 MySQL 中支持的字符集可以用下边这个语句:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];

比较规则地查看

查看 MySQL 中支持的比较规则的命令如下:
SHOW COLLATION [LIKE 匹配的模式];
每种字符集对应若干种比较规则,每种字符集都有一种默认的比较规则,

字符集和比较规则地应用

各级别地字符集和比较规则

MySQL 有4个级别的字符集和比较规则,分别是:
服务器级别
数据库级别
表级别
列级别

查看和设置服务器级别

MySQL 提供了两个系统变量来表示服务器级别的字符集和比较规则:
character_set_server //服务器级别的字符集
collation_server //服务器级别的比较规则
可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中使用 SET 语句修改这两个变量的值。

查看和设置数据库级别

在创建和修改数据库的时候可以指定该数据库的字符集和比较规则
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称]

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

查看当前数据库使用的字符集和比较规则,可以查看下面两个系统变量的值(选定默认数据库地前提)
character_set_database //当前数据库的字符集
collation_database //当前数据库的比较规则
character_set_database 和 collation_database 这两个系统变量是只读的,我们不能通过修改这两个变量的值而改变当前数据库的字符集和比较规则。

表级别

在创建和修改表的时候指定表的字符集和比较规则,语法如下:
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]]

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

如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则。

列级别

对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则,我们在创建和修改列定义的时候可以指定该列的字符集和比较规则,语法如下:
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列…
);

ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
在转换列的字符集时需要注意,如果转换前列中存储的数据不能用转换后的字符集进行表示会发生错误。

仅修改字符集或仅修改比较规则

由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化,具体规则如下:
只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。
只修改比较规则,则字符集将变为修改后的比较规则对应的字符集
不论哪个级别的字符集和比较规则,这两条规则都适用

总结

如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
如果创建或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
如果创建或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则

客户端和服务器通信中的字符集

编码和解码使用的字符集不一致

乱码

字符集转换地概念

从一种字符集转换为另一种字符集

mysql中字符集地转换

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值