mysql中,int(1)和int(10)和int(11)的区别

阅读更多

       首先,要知道int占用4个字节(4*8=32位)。而int的最大值为2^32=4294967295,如果有符号,则为2^31,由此可见,与mysql的int类型数字最大最小值一致。

       mysql中int类型默认长度11,其中正负值占用了一个单位的长度,这里的长度仅代表数字的长度,即数字10长度为2,数字100长度为3,以此类推。其实这里长度只是展示的长度,与存储占用的多少无关,即int(1)和int(10)和int(11)的存储空间都是占用4字节,这里是完全一样的。

a)默认有正负值,只是如果勾选UNSIGNED无符号数,则int(3)或int(10)或int(11)的值范围变成0~4294967295

b)除非都加上ZEROFILL,会在数字前面补0

 

那么,varchar(4)呢(据说最大varchar(21845)),一般默认是utf-8格式:

a)假如存4个汉字,则占用4*3=12字节。

b)存4个字母,则占用4*1=4字节。

c)varchar会用一个或两个字节保存长度。即varchar(20)和varchar(255)对应的索引长度分别为20*3(utf-8)(+2+1),255*3(utf-8)(+2+1),其中"+2"用来存储长度信息,“+1”用来标记是否为空,加载索引信息时用varchar(255)类型会占用更多的内存; (备注:当字段定义为非空的时候,是否为空的标记将不占用字节)

d)硬盘上,varchar(100)和varchar(200)存储一个相同的字符串,实际是一样的,根据字符长度分配存储空间。但mysql在内存保存时,是使用固定大小的内存块保存值,就是使用字符类型中定义的长度,varchar(200)即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。详见

 

那么,char(4)呢?

a)从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。

b)考虑其长度的是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常使用采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。

另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。

       varchar和char,二者在磁盘上存储占的空间是一样的。区别有二。第一、一个变长一个固定长度。第二、在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的。

 

附带参考:

 

ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值-128,最大值127。如一个ASCII码就是一个字节。

UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。

Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节。

 

 

 

你可能感兴趣的:(mysql中,int(1)和int(10)和int(11)的区别)