Skip to content

Latest commit

 

History

History
47 lines (36 loc) · 2.11 KB

char和varchar数据类型的区别.md

File metadata and controls

47 lines (36 loc) · 2.11 KB

char和varchar数据类型的区别

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