char:定长,效率高,通常用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等mysql
varchar:不定长,效率偏低sql
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)定义的列的长度为固定的,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,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范围是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语句中的字段,考虑加索引,整形的尤为适合加索引。