【IT168技术文档】1. 环境版本:
OS : LINUX AS4
MYSQL: 5.0.51a-log
ENGINE : Myisam
2. 分析
DATATIME 类型 共占3个字节(24位),范围'-838:59:59'到'838:59:59' ,格式'HH:MM:SS'
在存储时(类似于datatime类型中的time部分),先将时间转换成INTEGER形式:
HOUR*10000+MIN*100+SECOND
比如, "30:56:12",其中:
注意这里都是用十进制来计算的.
---------------------------------------------
时间: 30*10000 + 56*100 +12 --> 305612
---------------------------------------------
将得到的INTEGER数值转成十六进制:
十进制 十六进制
---------------------------------------------
305612 --> 4A9CC
注意:日期时间字段的数据是反向存储的.
所以存到数据文件里应该是: cc a9 04
3. 验证
下面我们可以来验证一下上面的分析结果:
drop table if exists heyf;
create table heyf (id int ,curtime time) type myisam;
insert into heyf values (11,'30:56:12');
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------
0000000 0bf9 0000 cc00 04a9
0000008
----------------------------
其中:
f9 : 标志位
0b 00 00 00 : COL1 ,INT = 11
cc a9 04 : 即时间.由于是反向存储,所以需要反向读取: 04a9cc
在这里我们看到,存储的内容与我们第2步中分析出来的结果是一致的!
4. 相关函数
4.1 十六进制转成十进制
select 0x04a9cc+0 ;
-------------------
305612
或
select conv("04a9cc",16,10) ;
--------------------
305612
4.2 十进制转成十六进制
select conv(305612,10,16) ;
--------------------
04a9cc