mr_mablevi的专栏

拥抱变化,

字段类型的存储(char和varchar)比较

本意是想http://topic.csdn.net/u/20111012/09/6110254b-a68e-49d9-a18a-a061e9bebe89.html解决这个帖子中的问题。但是在测试的时候发现了一个有趣的东西:

直接看例子:

表:

CREATE TABLE j_char (  `id` int(11) DEFAULT NULL,  `aa` char(10) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE j_varchar (  `id` int(11) DEFAULT NULL,  `aa` varchar(10) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

他们的大小:

-rw-rw---- 1 mysql mysql 8.4K 09-28 06:34 j_char.frm
-rw-rw---- 1 mysql mysql    0 09-28 06:34 j_char.MYD
-rw-rw---- 1 mysql mysql 8.0K 09-28 06:34 j_char.MYI


-rw-rw---- 1 mysql mysql 8.4K 09-28 06:34 j_varchar.frm
-rw-rw---- 1 mysql mysql    0 09-28 06:34 j_varchar.MYD
-rw-rw---- 1 mysql mysql 8.0K 09-28 06:34 j_varchar.MYI


分别向里面插入一条数据:

insert into j_char  values(1,'a');

insert into j_varchar  values(1,'a')


他们的大小变成:

-rw-rw---- 1 mysql mysql 8.4K 09-28 06:34 j_char.frm
-rw-rw---- 1 mysql mysql   15 09-28 06:37 j_char.MYD
-rw-rw---- 1 mysql mysql 8.0K 09-28 06:37 j_char.MYI


-rw-rw---- 1 mysql mysql 8.4K 09-28 06:34 j_varchar.frm
-rw-rw---- 1 mysql mysql   20 09-28 06:37 j_varchar.MYD
-rw-rw---- 1 mysql mysql 8.0K 09-28 06:37 j_varchar.MYI

为什么varchar的表会比char的表大?

继续插入的话MYD都是以15 和20的倍数增加,varchar的表还是比char的表大,为什么会有这样的情况?

15=1+4+10    这个好理解。

20=?              这个不懂了。

经过多次测试:(个人观点) 

即使建立一个表只有一个字段,并且字段类型是varchar的,他总会把默认设置为20字节。(和第2个表的占用空间一样,但是这个表还有个int类型的字段呢,为什么会一样呢?

经过多次建表增减字段,得出的结果是:

注意:要是表里的全部字段除了varchar字段的长度总和小于20字节的话,但包含varchar字段,则他们每行的占用空间都是20字节。这就印证了上面的例子:为什么varchar会比char大。


验证上面的结果,我把这2个表再加一个字段,让他的全部字段类型长度总和大于20字节。

加一个字段:

alter table j_char add column xxx bigint 

alter table j_varchar add column xxx bigint 


再看他们的大小:

-rw-rw---- 1 mysql mysql 8.5K 09-28 06:53 j_char.frm
-rw-rw---- 1 mysql mysql   23 09-28 06:53 j_char.MYD
-rw-rw---- 1 mysql mysql 8.0K 09-28 06:53 j_char.MYI


-rw-rw---- 1 mysql mysql 8.5K 09-28 06:54 j_varchar.frm
-rw-rw---- 1 mysql mysql   20 09-28 06:54 j_varchar.MYD
-rw-rw---- 1 mysql mysql 8.0K 09-28 06:54 j_varchar.MYI


23=1+4+10+8   这个没问题

1+4+8=13 小于20,那直接用varchar的默认 20来“覆盖”大小。


这时 char的占用大小比varchar 大了;


总结:

1:varchar 和 char 要是建表的时候,全部字段长度总和小于20字节的话,那用char 比较好;(第一张表的刚好说明这点,因为第一张表的字段总长度为4(int)+10(char)+1(标识)

2:要是他们的数字大于20(varchar(?)、char(?))的话,或则他们全部字段的总和就已经大于20字节的话,用varchar比char 好。


书上和资料上都varchar比char 省空间,但是这个也不是绝对的。比如上面的例子就表明了char比varchar 省。


另一个帖子的问题的int 我就当默认是7字节好了,这样好理解,哈哈,左大哥还特地去看了MYD文件的内容,虽然说的颇有道理,

但是这东西对我来说不好理解啊。大笑


以上代表个人观点。



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭