对于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 占用大小