字段类型的存储(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文件的内容,虽然说的颇有道理,
但是这东西对我来说不好理解啊。
以上代表个人观点。
直接看例子:
表:
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文件的内容,虽然说的颇有道理,
但是这东西对我来说不好理解啊。
以上代表个人观点。
相关文章推荐
- 关于 char(10) 与 varchar(20) 两个类型的字段的比较 (oracle 数据库)
- char和varchar类型的字段比较注意
- CHAR,VARCHAR,NVARCHAR,数据库字段类型
- MySQL数据库中的字段类型varchar和char的主要区别是什么?哪种字段查找效率要高?
- 去除指定表中数据类型是VARCHAR,CHAR,NVARCHAR的字段值中的不可见字符
- MySQL 数据库中的字段类型 varchar 和 char 的主要区别是什么?哪 种字段的查找效率要高,为什么?
- SQL Server中字段数据类型char nchar varchar nvarchar的区别
- C# 中字符串“1.0”和数据库中char(10)类型的字段值“1.0”比较。
- 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本
- varchar类型的字段存储纯数字的排序
- 去除指定表中数据类型是VARCHAR,CHAR,NVARCHAR的字段值中的不可见字符
- oracle数据库中varchar类型字段中存放的有数字和汉字情况,比较大小问题解决
- 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本
- 数据库中存储日期的字段类型到底应该用varchar还是datetime
- char、varchar与nvarchar三种数据类型比较
- 测试 Oracle 中对 char 和 varchar2 两种类型的等值比较
- 数据库有一个CHAR类型的字段,是用来存储时间的,如:1:20(一个小时20分),怎么对它算平均值和总值?
- MySQL 字段类型varchar,CHAR,text
- MySQL数据类型char、varchar、text的比较
- SQL string类型字段存储比较