首先明确,计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。计算机在设计时采用的是8个比特(bit,数据储存的最小单位,1bit储存一个二进制位)为一个字节(byte)。
计算机最早由美国人发明,故最早只有128个字符被编码到计算机中,形成了ASCII编码。这128个符号只占用了一个字节的后7位,第一位统一规定为0(第一阶段ASCII编码)。当然,只用一个字节来处理中文或者其他语言是远远不够的,因此每个国家又根据自己的语言制定了自己的编码标准,如GB2312,BIG5,JIS等(第二阶段ANSI编码)。由于各个国家之间标准不同,就出现了乱码。这是又出现了UNICODE编码,将各个国家的语言设置成惟一的编码,统一了编码标准(第三阶段UNICODE编码)。
1.字符串在内存中的存放方法
第一阶段ASCII编码,比如“chuhang123”,每一个字符用一个字节表示,故有10个字节。
第二阶段ANSI编码,比如“楚航123”,在中文windows95内存中,占7个字节,一个汉字2个字节,一个英文或数字 占一个字节。
第三阶段UNICODE编码,比如“楚航123”,在windows2000中,占10个字节,用2个字节来存放一个序号。
2.字符、字节、字符串的关系
(1)字符:抽象意义上的一个符号,如“1”,“楚”,“¥”等。
(2)字节:计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。如:00001010等。
(3)字符串:顾名思义,多个字符的集合,即为字符串字符串有UNICODE字符串、ANSI字符串。如:“楚航123”等。
3.UTF8和UNICODE
首先强调, UTF8是UNICODE中的编码方式之一,也是最流行的编码方式。 UTF8的编码规则,请自行google。
4.数据库中字段类型及长度的含义
(1)int(x),int类型,占用4个字节,无符号类型时,能储存最小值0,最大值2的32次方,与长度x无关。比如int(1),也可以储存342342。当数据库设置int(11)时,我们要存入从1——10的10个数,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0。你可能会问,int(1)只有一位,为什么也能储存那么多位呢,只要储存的数在该类型的储存范围以内,mysql也能正常储存。我们只要明确一点,字段类型的长度与储存的数无关就行了。
(2)varchar(x),mysql4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)。5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节。即varchar(x),x的最大值为65532,如下图:
(3)再来说一下char(x),CHAR(x)定义的列的长度为固定的,x取值可以为0~255之间。char是固定长度的,而varchar会根据具体的长度来使用存储空间。比如char(255)和varchar(255),在存储字符串"hello world"的时候,char会用一块255的空间放那个11个字符,而varchar就不会用255个,他先计算长度后只用11个再加上计算的到字符串长度信息,一般1-2个byte来,这样varchar在存储不确定长度的时候会大大减少存储空间。 这是否意味着CHAR的数据类型劣于VARCHAR呢?其实不然。否则的话,就没有必要存在CHAR字符类型了。虽然VARCHAR数据类型可以节省存储空间,提高数据处理的效率。但是由于某种原因char 固定长度,所以在处理速度上要比varchar快速很多。
延伸阅读:
1.http://www.regexlab.com/zh/encoding.htm
2.http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
4.http://www.cnblogs.com/echo-something/archive/2012/08/26/mysql_int.html
5.http://www.2cto.com/database/201208/150865.html