MySQL - 字符 vs 字节
总结
在UTF-8字符集下,一个中文字符占用3个字节,一个英文字符占用1个字节。
在GBK编码下,则一个中文汉字占2个字节,英文占1个字节
字符:用输入法单独打出的任何单个的内容。对于中文和英文而言,以下内容分别都是1个字符:
(1)1个中文字,例如“是”
(2)1个英文字母,例如“T”
(3)1个中文标点符号,例如“。”
(4)1个英文标点符号,例如“.”
什么是字符
以下是百科对字符的定义:
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。
为了方便理解,你可以将字符简单地理解为你可以用输入法单独打出的任何单个的内容。对于中文和英文而言,以下内容分别都是1个字符:
(1)1个中文字,例如“是”
(2)1个英文字母,例如“T”
(3)1个中文标点符号,例如“。”
(4)1个英文标点符号,例如“.”
所谓的“字符串”就是由以上说的一个个字符组成的,字符串就是由一个个字符拼接而成的列表,以下是Javascript代码演示:
const str = 'A啊a1'
console.log(str[0]) // 'A'
console.log(str[1]) // '啊'
console.log(str[2]) // 'a'
console.log(str[3]) // '1'
在MySQL中,你可以使用 CHAR_LENGTH() 函数,查看指定字符串的字符数。例如:
SELECT CHAR_LENGTH('A啊a1') -- 4
什么是字节
字符就介绍到这里,接下去说字节。百科给的定义是:
字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位。
如果你只是在纸上写字,那么就用不到字节,但是如果你要把字存入电脑,就需要占用一定的磁盘空间。我们知道,电脑只能用高电位、低电位的形式存储数据,抽象出来,那就是电脑存数据最终只能用二进制的形式,也就是用0和1表示,无论任何数据,最终存储的时候都是一段包含多个0和1的串,例如“00110101”,这里的每一个0或1被称为1位。“位”就是最小的存储单位,然后我们把8位称为1个字节,也就是1个字节等于8位。这个概念类似于“1公里=1000米”,本质上是一回事,只是使用不同级别的单位而已。由于二进制实在太长,不方便展示,所以一般将1个字节(8位)的二进制转换成十六进制进行展示,例如将11010011转换成十六进制就是D3,这就是一个字节。
你没有办法直接在电脑里面存入字符,例如你没有办法将“你好世界”这四个字进行存储,现行的方案是将字符编码成0和1数字串的形式,两者建立映射关系。例如你可以用“1”表示“你”,用“10”表示“好”,用“101”表示“世”,用“111”表示“界”。反过来讲,如果你发现磁盘某一段地方存了“101”,那你就知道这里代表着“世”这个中文字。
当然以上的这个方案只是一套勉强行得通的方案,这种方案很多,我们把这种方案叫做“字符集”。我们在使用MySQL时,最常用的字符集就是 UTF-8 。这个字符集和上面说的这个方案没有本质区别,只是建立映射关系不同而已。
我们可以看下字符“你”在UTF-8字符集下的表示方式,在MySQL中你可以直接使用 HEX() 函数来进行转换。
SELECT HEX('你') -- E4BDA0
可以看出,使用UTF-8字符集,字符“你”需要使用3个字节来进行存储(分别是E4,BD,A0),实际存储的二进制是
111001001011110110100000
再次说明,E4BDA0 只是 111001001011110110100000 的简写形式,两者本质上是一回事。
我们继续看一下,存储一个英文字符需要占用多少字节。
SELECT HEX('Z') -- 5A
可以看到,存储英文字符“Z”只需要一个字节。
在MySQL中,你可以直接使用 LENGTH() 函数来查看指定字符串占用的空间(字节数)。
SELECT LENGTH('你') -- 3
SELECT LENGTH('Z') -- 1
SELECT LENGTH('A啊a1') -- 6
你可以直接记住结论:在UTF-8字符集下,一个中文字符占用3个字节,一个英文字符占用1个字节。如果要计算字符串占用的字节数,只需要按照这个方式想加即可。
参考文档 - 必看
理解字节,字符的区别和关系: https://blog.csdn.net/qq_60317308/article/details/131187829