日期:2014-05-16  浏览次数:20945 次

分享数字类型的存储---抛砖引玉
下面数据仅测试数字类型的存储
我也不知道这样的测试方法是否本身就有问题,希望知情者赐教。

SQL code

int数据是如何存储的?
Myisam引擎,5.1.59-community-log版本

1:测试最简单的INT,单个字段
mysql> create table test (id int);
Query OK, 0 rows affected (0.01 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql    0 Oct 11 23:29 test.MYD
mysql> insert into test values(2);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql    7 Oct 11 23:30 test.MYD
mysql> 
#插入一条记录,占用了7个字节。
#用UltraEdit打开这个文件查看,内容如下:
FD 02 00 00 00 00 00     #16进制显示的,第二个字节存储的是数据。
猜的(第一位FD是记录开始标志位,2-5位是数据位,6-7是记录结束标志)
如果只有一个INT字段,那么一条记录就比标准的4字节,多出了3个字节。

再测试2个字段的
mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test (id int,a tinyint);
Query OK, 0 rows affected (0.03 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql    0 Oct 11 23:37 test.MYD
mysql> insert into test values(4,5);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql    7 Oct 11 23:37 test.MYD
mysql> 

2个字节,一条记录,也是占用7个字节
#用UltraEdit打开这个文件查看,内容如下:
F9 04 00 00 00 05 00
猜的(第1位变成F9了,第2-5位是第一个字段的数据位,第6位是第2个字段的数据位,第7位是记录结束位)

再测试3个字段的
mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test (id int,a tinyint,b bigint);
Query OK, 0 rows affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql    0 Oct 11 23:42 test.MYD
mysql> insert into test values(4,5,6);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql   14 Oct 11 23:42 test.MYD
mysql> 
#用UltraEdit打开这个文件查看,内容如下:
F1 04 00 00 00 05 06 00 00 00 00 00 00 00
猜的(第1位F1,2-5是第一个字段的数据位,第6位是第二个字段的数据位,第7-14位是第三个字段的数据位。记录开始位变了,没有结束位了)
3个字段的数据存储大小符合规则。1+4+1+8=14


第一位是记录开始标志位,这个基本肯定,而且标示了字段的数据类型。行记录字节数低于7字节的,用00补全,占用7字节。超过7字节的,按实际字段字节数存储。
用4个字段验证,字节数也是正确的。



------解决方案--------------------
很少有人这么钻研了
------解决方案--------------------
ding..........
------解决方案--------------------
探讨
http://topic.csdn.net/u/20111012/09/6110254b-a68e-49d9-a18a-a061e9bebe89.html?seed=194308995&r=75946793#r_75946793

和这个帖子的楼主探讨后作的实验。
相关信息看这个帖子。

------解决方案--------------------
探讨
很少有人这么钻研了

------解决方案--------------------

------解决方案--------------------
恩,不错还可以,支持下了
------解决方案--------------------
论坛需要这样的人, 很多人也在钻研, 但有了成果后都藏得很深, 呵呵
谢谢楼主分享!
------解决方案--------------------
mysql> system ls -al /var/lib/mysql/DB |grep test.MYD
-rw-rw---- 1 mysql mysql 0 Oct 11 23:42 test.MYD
mysql> insert into test values(4,5,6);
Query OK, 1 row affected (0.00 sec)

mysql> system ls -al /var/lib/mysql/DB |grep test.MYD