0%

mysql字符集和比较规则

1.字符集和比较规则

1.1.字符集介绍

因为计算机只能存储二进制数据,那人类能够看懂的文字符号是怎么存到计算机的呢?

解决方式:字符与二进制数据建立映射关系

有两个概念需要了解下编码解码

1.将字符映射成二进制数据的过程叫做编码

2.将二进制数据映射成字符的过程叫做解码

所以用来描述某个字符范围的编码规则称为字符集

例如经典的ASCII字符集:

1
2
3
字符    二进制
A<---->01000001
a<---->01100001

世界太大了,不同的人制定了不同的字符集,有ASCII字符集、ISO 8859-1字符集、GBK字符集、utf8字符集。我们写代码过程中经常能遇到utf8格式的字符。

1.2.比较规则介绍

如何比较两个字符的大小呢?

最容易想到的就是直接比较二进制大小,把字符转成二进制让计算机去比。但是对于复杂的现实生活,c和C的二进制不相等,但是表达的含义是相等的,只是区分了大小写,不能说它们不一样啊!这时候,就需要定义比较规则了。这里的规则是把它们全转成大写或者小写再比较。

1
fmt.println(strings.ToLower(string('c')) == strings.ToLower(string('C')))

不同的字符集有不同的比较规则,同一种字符集也有不同的比较规则

2.mysql中支持的字符集和排序规则

在项目开发的过程中,我们经常需要建库或者建表,也肯定见到过utf8和utf8mb4。

使用utf8字符集表示一个字符需要占用1-4个字节存储,实际上我们经常用的字符仅占用1-3个字节存储。

为了提高mysql系统的存储和性能,mysql的作者定义了两个概念:

1
2
utf8mb3: 占用1-3字节
utf8mb4: 占用1-4字节

注意:在mysql中,utf8是utf8mb3的别名

2.1.字符集查看

我是使用的mysql版本是8.0.27

1
show charset;

这里可以看到这个版本的mysql有41种字符集。

2.2.比较规则的查看

查看utf8字符集下的比较规则

1
show collation like 'utf8%';

这些比较规则都是以utf8_开头的,utf8_german2_ci是德语比较规则,utf8_roman_ci是罗马比较规则。像utf8_general_ci就是通用比较规则,_ci结尾表示不区分大小写。如果是cs结尾表示区分大小写,as结尾区分重音,ai结尾不区分重音。

当我们看到utf8_general_ci的Default列出现Yes,这说明对于utf8字符集的比较规则默认是utf8_general_ci

3.字符集和比较规则应用

3.1.mysql有4个级别的字符集和比较规则

3.1.1.服务器级别

**注意:**这里的服务器是指mysql自身服务

可以在mysql的配置文件中修改然后启动。

3.1.2.数据库级别

3.1.3.表级别和列级别

比如下面这条建表语句

注意:以上的级别中如果没有主动选择字符集和排序规则,将会默认选择上一级的字符集和排序规则,服务器>数据库>表>列。

3.2.字符集转换

在计算机中,如果一个字符串编码和解码使用的字符集不同,会产生奇奇怪怪的字符。

有时候在电脑中能看到这种字符:

1
2
3
4
原文:适才相戏耳
乱码:适財楿戱洱

这就是编码解码选择的字符集不同造成的结果

这时候就出现了字符集转换的概念:把某个字符按照自身的字符集解码成二进制,再使用另外一套字符集把二进制编码成字符。

3.2.1.mysql中字符集的转换

注意:
1.客户端采用的字符集和 character_set_client 不一样的话,就会导致服务器无法理解和处理请求。

2.客户端采用的字符集和 character_set_results 不一样的话,这就可能会出现客户端无法解码结果集。

修改字符集sql语句:

1
2
3
SET character_set_client = 字符集名;
SET character_set_connection = 字符集名;
SET character_set_results = 字符集名;