char -- varchar -- text -- blod
1、char和varchar分别称为定长和变长类型
- 定长效率高,查找行纪录时,如果都是定长,完全可以通过行数与行的长度计算出来,文件指针的偏移量
如:char(6),想查找第三个人名,指针只需从存储的首地址往后移动3*6=18个字符就行。 - 定长浪费空间,不论够不够指定长度,实际都占据N个长度,如果不够N个长度,用空格在末尾补至N个长度
如:char(N),不够N个长度,用空格在尾部补够N个长度,浪费了尾部 - char型,不够M格字符用空格补,取出的时候再把右侧的空格删掉,这意味者,如果右侧本身有空格,将会丢失。
- 对于varchar(N),不用空格补齐,但是在列内容前,用1-2个字节来标志该列的长度
- 定长字符空间利用率能达到100%;变长类型不能,每个字段需要额外的1~2个字节存储该字段的长度。
- 注意:char(M),varchar(M)限制的是字符,不是字节。
如char(2) charset utf8,能存2个utf8字符,比如“中国”,“ab”。
| 类型 | 宽度 | 可存字符 | 实际字符(i<=M) | 实占空间 | 利用率 |
|---|---|---|---|---|---|
| char | M | M | i | M | i/M<=100% |
| varchar | M | M | i | i字符+(1~2)字节 | i/(i+1~2)<100% |
char(M),M代表宽度,0<=M<=255之间
varchar(M),M代表宽度,0<=M<=65535(以ascii字符为例,utf8 22000左右)
create table test(
ca char(6) not null default '',
vca varchar(6) not null default ''
)engine myisam charset utf8;
insert into test values ('aa ','aa ');
select concat(ca,'!'), concat(vca,'!') from test;
+----------------+-----------------+
| concat(ca,'!') | concat(vca,'!') |
+----------------+-----------------+
| aa! | aa ! |
+----------------+-----------------+
1 row in set
显示:char类型字符后的空格丢失
2、text
- 文本类型,可以存储比较大的文本字段,搜索速度稍慢,因此不是特别大的字符,建议用char,varchar来代替。
- 一般用来存储文章内容,新闻内容等
- text不用加默认值(加了也没用)
代码:
create table test2( article text );
3、blob的意义
- blob是二进制类型,用来存储图像、音频等二进制信息。
- 意义:2进制,0-255都有可能出现,blob在于防止因为字符集的问题,导致信息的丢失
比如:一张图片中有0XFF字节,这个在ascii字符集认为非法,在入库的时候,被过滤了
代码:
alter table test2 add img blob;