浅析char与varchar类型、varchar(100)和varchar(10)的区
别、。。。
⼀、varchar(100) 和 varchar(10) 的区别在哪⾥
  ⼀般初学者会认为,⼆者占⽤的空间是⼀样的。⽐如说我存储5个char,⼆者都是实际占⽤了5个char了【不准确的想法:varchar在实际存储的时候会多⼀个byte⽤来存放长度】。
  但是深⼊⼀下,设计数据库的时候,⼆者⼀样吗?答案是否定的。【⾄少varchar类型需要在数据之前利⽤⼀个或者两个字节来存储数据的长度】并且⼆者在内存中的操作⽅式也是不同的。
  下⾯的例⼦中有体现如现在⽤户需要存储⼀个地址信息。根据评估,只要使⽤100个字符就可以了。但是有些数据库管理员会认为,反正varchar数据类型是根据实际的需要来分配长度的,还不如给其⼤⼀点的呢。为此他们可能会为这个字段⼀次性分配200个字符的存储空间。
1、存储空间相同,但是对内存的消耗是不同的
  这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。
  虽然他们⽤来存储90个字符的数据,其存储空间相同,但是对于内存的消耗是不同的。
  对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是,其是使⽤固定⼤⼩的内存块来保存值。
  简单的说,就是使⽤字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产⽣⽐较⼤的不利影响。假设VARCHAR(100)与VARCHAR(200)类型,实际存90个字符,它不会对存储端产⽣影响(就是实际占⽤硬盘是⼀样的)。但是,它确实会对查询产⽣影响,因为当MySql 创建临时表(SORT,ORDER等)时,VARCHAR会转换为CHAR,转换后的CHAR的长度就是varchar的长度,在内存中的空间就变⼤了,在排序、统计时候需要扫描的就越多,时间就越久。
  所以如果某些字段会涉及到⽂件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择⼀个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,⽽随意的分配长度,或者说⼲脆使⽤最⼤的字符长度。
2、char 与 varchar 对产⽣碎⽚的区别
  从碎⽚⾓度进⾏考虑,使⽤CHAR字符型时,由于存储空间都是⼀次性分配的。为此某个字段的内容,其都是存储在⼀起的。单从这个⾓度来讲,其不存在碎⽚的困扰。⽽ varchar 可变长度的字符数据类型,
其存储的长度是可变的。当其更改前后数据长度不⼀致时,就不可避免的会出现碎⽚的问题。故使⽤可变长度的字符型数据时,数据库管理员要时不时的对碎⽚进⾏整理。如执⾏数据库导出导⼊作业,来消除碎⽚。
3、从长度是否相近考虑使⽤ char 或 varchar
  考虑其长度的是否相近,如果某个字段其长度虽然⽐较长,但是其长度总是近似的,如⼀般在90个到100个字符之间,甚⾄是相同的长度。此时⽐较适合采⽤CHAR字符类型。⽐较典型的应⽤就是MD5哈希值。当利⽤MD5哈希值来存储⽤户密码时,就⾮常适和采⽤CHAR字符类型,因为其长度是相同的。
  另外,像⽤来存储⽤户的⾝份证号码等等,⼀般也建议使⽤CHAR类型的数据。
  另外请⼤家考虑⼀个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够⽤来保存单个的字符,但是VARCHAR要⽐CHAR多占⽤⼀个存储位置。这主要是因为使⽤VARCHAR数据类型时,会多⽤1个字节⽤来存储长度信息。这个管理上的开销char字符类型是没有的。
4、总结
  ⼆者在磁盘上存储占的空间是⼀样的,区别有⼆:
(1)第⼀:⼀个变长,⼀个固定长度。如果长度相近,尽量使⽤ char 类型
(2)第⼆:在内存中的操作⽅式,varchar也是按照最长的⽅式在内存中进⾏操作的。⽐如说要进⾏排序的时候,varcahr(100)是按照100这个长度来进⾏的。
(3)使⽤ varchar 数据类型,会多⽤ 1 个字节来存储长度信息,造成管理上的开销。
(4)char 不会产⽣碎⽚,varchar 会产⽣碎⽚,需要碎⽚整理。
⼆、varchar的最⼤长度是多少
1、⼀个字符占多少字节
  具体还是要看版本的,⼀个字符占⽤3个字节,⼀个汉字(包括数字)占⽤3个字节 = ⼀个字符
  MySQL 4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
  MySQL 5.0版本以上,varchar(100),指的是100字符,⽆论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。
  UTF8编码中⼀个汉字(包括数字)占⽤3个字节
  GBK编码中⼀个汉字(包括数字)占⽤2个字节
2、varchar 的最⼤长度是多少,可以存储多少汉字
  mysql 的varchar字段的类型虽然最⼤长度是65535,但是并不是能存这么多数据,最⼤可以到65533,其中需要1到2个字节来存储数据长度(如果列声明的长度超过255,则使⽤2个字节来存储长度,否则1个字节)。当不允许⾮空字段的时候(因为要⽤⼀个字节来存储不可为空的标识),当允许⾮空字段的时候只能到65532(省下了存储⾮空的那个字节)。
  ⾏中可以⽤的字节数如下计算:
(1)字段⾮空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) - 1 (null byte)=65531 字节可以⽤。减1的原因是实际⾏存储从第⼆个字节开始。
(2)字段可以空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) =65532 字节可以⽤。
  根据这个最⼤字节数,以及编码⽅式,可以计算能存储的汉字数。
varchar2最大长度
三、字符、字节、位,之间的关系
1、位
  数据存储的最⼩单位。每个⼆进制数字0或者1就是1个位。
2、字节
  8个位构成⼀个字节;即:1 byte (字节) = 8 bit(位);
  1 KB = 1024 B(字节);1 MB = 1024 KB; (2^10 B)1 GB = 1024 MB; (2^20 B)1 TB = 1024 GB; (2^30 B)
3、字符
  a、A、中、+、*、の……均表⽰⼀个字符;⼀般 utf-8 编码下,⼀个汉字字符占⽤ 3 个字节;数字属于汉字,和汉字占⽤⼀样字节。⼀般 gbk 编码下,⼀个汉字字符占⽤ 2 个字节;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。