字符编码和数据类型笔记

来源:互联网 发布:java得到项目路径 编辑:程序博客网 时间:2024/05/17 01:59

首先明确,计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。计算机在设计时采用的是8个比特(bye,数据储存的最小单位,1bye储存一个二进制位)为一个字节(bite)。

计算机最早由美国人发明,故最早只有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

3.http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

4.http://www.cnblogs.com/echo-something/archive/2012/08/26/mysql_int.html

5.http://www.2cto.com/database/201208/150865.html




0 0