一文看懂字符和字节的意思
原创前言
我们在数据库建表时,经常会困扰某个字段应该选择什么数据类型,以及填写什么长度。选择数据类型方面一般没什么大问题,但是在填写对应的长度的时候,很多人就会困扰,对应长度填写的数字到底是什么含义,以及会影响到哪些东西。笔者在翻阅网上的相关文章时,发现一大半文章写的都是错的,主要的问题在于搞混了“字符”和“字节”这两者的含义,甚至有的人觉得这就是一回事。本文首先先来讲解“字符”和“字节”这两者的含义,然后在下一篇文章介绍MySQL的数据类型中长度的含义。
字符
以下是百科对字符的定义:
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。
为了方便理解,你可以将字符简单地理解为你可以用输入法单独打出的任何单个的内容。对于中文和英文而言,以下内容分别都是1个字符:
(1)1个中文字,例如“是”
(2)1个英文字母,例如“T”
(3)1个中文标点符号,例如“。”
(4)1个英文标点符号,例如“.”
所谓的“字符串”就是由以上说的一个个字符组成的,字符串就是由一个个字符拼接而成的列表,以下是Javascript代码演示:
const str = A啊a1
在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
你可以直接记住结论:在UTF-8字符集下,一个中文字符占用3个字节,一个英文字符占用1个字节。如果要计算字符串占用的字节数,只需要按照这个方式想加即可。
更容易理解的例子
如果通过以上的讲解还不能理解字符和字节的关系,我们再来讲一个更容易理解的例子。
比如某种饮料有大瓶3升的和小瓶1升的,但是无论“大瓶”的还是“小瓶”的,我们都称为“1瓶”。如果你将饮料导入饮料桶中,将大瓶倒入的时候要占用3升的空间,倒小瓶的时候,只需要占1升的空间。
上面例子说的“1瓶”饮料,对应1个字符,这是一个抽象概念,人为定义的。但是1个字符占用的空间各有不同,1个中文字符占用3个字节,1个英文字符占用1个字节,对应以上大瓶和小瓶的饮料倒入饮料桶占用的空间。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除