char与varchar

对于char与vafchar停留于一个定长和变长的概念中, 且还以为varchar是可自动变长.


如何可以查看到存储后值的长度?

varchar

可变长:指定长度后可系统自动计算存入的长度, 字符存入的长度不能超过指定的长度. eg: nickname varchar(5) 值1: abc 那么此时长度为3 值2:abcefg 超出部分g是无法存入的.
长度上加1字符: 每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)

  • 大于varchar(255)变为 tinytext
  • 大于varchar(500)变为 text
  • 大于varchar(20000)变为 mediumtext

char

定长: 定好字段长度后不管存入的字符多少占用的长度都是一样的. eg: nickname char(3) 值1: ac 占用长度为3 值2: abc 占用长度为3

差异与共同点

  • char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节
  • char的上限为255字节,varchar的上限65535字节,text的上限为65535
  • char在存储的时候会截断尾部的空格,varchar和text不会
  • varchar会使用1-3个字节来存储长度,text不会
  • char效率比varchar高
  • varchar比char节省空间-但不节省内存

查阅资料

MySQL之char、varchar和text的设计 文章写很清晰有各个属性占用字符长度的表格及分析了varchar与text性能与空间对比
mysql中char与varchar的区别分析 有关于存储引擎的建议
MySQL中varchar与char类型区别 提及到4.1与5.0之后版本对空格处理的不同, 关于内存使用情况 有对空格处理情况重现的实例
数据库字段类型中char和Varchar区别 一篇比较久远的文章, 提到了 varchar2 及 ASCII 占用大小

发表评论