varchar

注意:以下都是MySQL 5.0版本及以上
存储以字符为单位,一个字符具体多少字节视编码而定,所以varchar是不定长的。

varchar(20):指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个。

  • 在不允许非空的情况下,varchar最多可以存放65533字节长度的数据,还有2字节用与存放标识varchar存储的字节长度(在255以内用1个字节表示)
  • 在允许非空的情况下,最多存放65532字节长度的数据,多了一个字节表示是否null为null。

    存储字符的编码长度限制

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

  • 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845;
  • 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

    char和varchar的区别

  • char:字节为单位,定长,效率高,一般用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等

  • varchar:字符为单位,不定长,效率偏低
  • 总结:从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

    char

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

    varchar

    VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间。VARCHAR类型的实际长度是它的值的实际长度+1(或+2,当如果列声明的长度超过255,则 使用两个字节)。varchar存储变长数据,但存储效率没有 CHAR高。
    举例:
    一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串"abcd",L是4而存储要求是5个字节。

    BLOB,TEXT

  • 与varchar类似,BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。

  • 4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。
  • 4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于 4个BLOB类型,并且有同样的最大长度和存储需求
  • BLOB保存的是二进制数据,可以储存图片;TEXT只能储存纯文本文件。

    参考

  • MySQL中的char与varchar详解