MySQL中的char与varchar详解

mysql中char与varchar的区别:

char:定长,效率高,通常用于固定长度的表单提交数据存储  ;例如:身份证号,手机号,电话,密码等mysql

varchar:不定长,效率偏低sql

一、varchar类型的变化

MySQL 数据库的varchar类型在4.1如下的版本中的最大长度限制为255,其数据范围能够是0~255或1~255(根据不一样版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说能够存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或如下版本中须要使用固定的TEXT或BLOB格式存放的数据可使用可变长的varchar来存放,这样就能有效的减小数据库文 件的大小。数据库

MySQL 数据库的varchar类型在4.1如下的版本中,nvarchar(存储的是Unicode数据类型的字符)不论是一个字符仍是一个汉字,都存为2个字 节 ,通常用做中文或者其余语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其余字符存为1个字节 ,varchar适合输入英文和数字。性能

4.0版本如下,varchar(20),指的是20字节,若是存放UTF8汉字时,只能存6个(每一个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,不管存放的是数字、字母仍是UTF8汉字(每一个汉字3字节),均可以存放20个,最大大小是 65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,可是Mysql5根据编码不一样,存储大小也不一样,具体有如下规则:编码

a) 存储限制code

varchar 字段是将实际内容单独存储在聚簇索引以外,内容开头用1到2个字节表示实际长度(长度超过255时须要2个字节),所以最大长度不能超过65535。对象

b) 编码长度限制排序

字符类型若为gbk,每一个字符最多占2个字节,最大长度不能超过32766;索引

字符类型若为utf8,每一个字符最多占3个字节,最大长度不能超过21845。图片

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c) 行长度限制

致使实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

二、CHAR(M), VARCHAR(M)不一样之处

CHAR(M)定义的列的长度为固定的,M取值能够为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程当中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,好比定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值能够为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集肯定。总体最大长度是65,532字节)。VARCHAR值保存时只保存须要的字符数,另加一个字节来记录长度(若是列声明的长度超过255,则 使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有 CHAR高。若是一个字段可能的值是不固定长度的,咱们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为何”+1″呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际状况找到权衡点。

CHAR和VARCHAR最大的不一样就是一个是固定长度,一个是可变长度。因为是可变长度,所以实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(若是超过255则须要两个字节)。若是分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。若是被裁掉 的字符不是空格,则会产生一条警告。若是裁剪非空格字符,则会形成错误(而不是警告)并经过使用严格SQL模式禁用值的插入。

三、VARCHAR和TEXT、BlOB类型的区别

VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型 的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储须要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串’abcd’,L是4而存储要求是5个字节。

BLOB和TEXT类型须要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR须要定义大小,有65535字节的最大限制;TEXT则不须要。若是你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不一样。

BLOB 能够储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于 4个BLOB类型,而且有一样的最大长度和存储需求。在BLOB和TEXT类型之间的惟一差异是对BLOB值的排序和比较以大小写敏感方式执行,而对 TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

四、总结char,varchar和text的区别

长度的区别,char范围是0~255,varchar最长是64k,可是注意这里的64k是整个row的长度,要考虑到其它的 column,还有若是存在not null的时候也会占用一位,对不一样的字符集,有效长度还不同,好比utf8的,最多21845,还要除去别的column,可是varchar在通常 状况下存储都够用了。若是遇到了大文本,考虑使用text,最大能到4G。

效率来讲基本是char>varchar>text,可是若是使用的是Innodb引擎的话,推荐使用varchar代替char。

char和varchar能够有默认值,text不能指定默认值。

数据库选择合适的数据类型存储仍是颇有必要的,对性能有必定影响。这里在零碎记录两笔,对于int类型的,若是不须要存取负值,最好加上unsigned;对于常常出如今where语句中的字段,考虑加索引,整形的尤为适合加索引。

相关文章
相关标签/搜索