您的位置:首页 > 其它

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

2011-10-13 17:53 423 查看
本意是想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文件的内容,虽然说的颇有道理,

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


以上代表个人观点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐