简单来看:
char是定长
varchar是可变长度
char效率要比varchar高一些,因为如果是定长,在寻址的时候会很方便的可以简单理解为(d-1)*N
比如要查第三个,则可以直接移动2N
对于定长N
不论够不够指定长度,实际都占用N个指定长度,如果不够指定长度,会在末尾用空格补至N个长度,浪费了尾部,但是当检索到CHAR值时,尾部的空格被删除掉。
char的范围为0-255
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
如果插入字符时,长度不够,mysql会自动裁剪,如果被裁剪掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。
同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
下面举例说明,样例出自MySQL5.1手册
下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:
值
CHAR(4)
存储需求
VARCHAR(4)
存储需求
''
' '
4个字节
''
1个字节
'ab'
'ab '
4个字节
'ab '
3个字节
'abcd'
'abcd'
4个字节
'abcd'
5个字节
'abcdefgh'
'abcd'
4个字节
'abcd'
5个字节
注意:在char和varchar一定要注意char在取数据时,会删除末尾空格,因此当定义了char时,如果存入"ab "这样的数据到mysql中,取出数据的时候,mysql会删掉后面的空格
char(M)和varchar(M)限制的是字符,并不是字节
varchar可以存65535
char可以存255
上面都是指的字符
举例说明:
char(6) utf8的字符编码,则可以存‘中华人民共和’六个字符,所以在utf8下一个中文字符占用3个字节,所以一共是18个字节
gbk一个汉字占用2个字节
这里占了18个字节,并不是可以存18个英语字母,还是只能存18个字母,数字同理
text存储文本
blob存储二进制类型
blob在于防止因为字符集的问题,导致信息丢失