char和varchar都用来表示字符串数据
varchar长度可变, 比如varchar(10), 如果存储'github', 会占用6个字符的长度;
char长度不可变, 比如char(10), 如果存储''github', 会占用10个字符的长度,
'github'后面会跟4个空格, 取数据的时候会将添加的空格trim掉.
因为char的长度固定, 方便数据的存储和查找, 所以char的时间效率比varchar高, 但是char的空间占用比varchar高
MySQL4.0以前, char(20)和varchar(20)指的是20个字节长度, 如果存放utf8汉字(3个字节)时, 只能存放6个
5.0版本以上, char(20)和varchar(20)指的是20个字符长度, 无论存放数字/字母/utf8汉字(3个字节), 都可以存放20个
# char
char范围是0-255, 可以存储255个字符
# varchar
MySQL要求一个行定义长度不能超过65535个字节.
MySQL对于varchar会有1-2个字节来保存字符长度, 当字符数小于等于255时, MySQL只用1个字节来记录,
因为2的8次方减1只能存到255, 当字符数多于255就用2个字节.
英文字符和数字占1个字节, GBK字符集每个汉字占两个字节, UTF8字符集每个汉字占三个字节
GBK 一个字符占1-2个字节, varchar最多能存 32766 个字符(65535-1-2 / 2)
UTF8 一个字符占1-3个字节, varchar最多能存 21844 个字符(65535-1-2 / 3)
减1的原因是实际存储从第二个字节开始, 减2的原因是varchar头部的2个字节表示长度
举例说明:
a)若一个表只有一个varchar类型,如定义为:
create table t4(c varchar(N)) charset=gbk;
则此处N的最大值为(65535-1-2)/2 = 32766 个字符
减1的原因是实际存储从第二个字节开始, 减2的原因是varchar头部的2个字节表示长度, 除2的原因是字符编码是gbk
b)若一个表定义为
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
则此处N的最大值为(65535-1-2-4-30*3)/3=21812
减1和减2的原因与a)相同, 减4的原因是int类型的c占4个字节, 减30*3的原因是char(30)占用90个字节, 编码是utf8