【IT168技术文档】1. 环境版本:
OS : LINUX AS4
MYSQL: 5.0.51a-log
ENGINE : Myisam
2. 分析
DATATIME 类型 共占8个字节(64位),范围'1000-01-01 00:00:00'到'9999-12-31 23:59:59' ,格式'YYYY-MM-DD HH:MM:SS'
其中:从左到右数
1~32位: 存储日期(共32位) = year*10000 + month*100 + day
33~64位: 存储时间(共32位) = hour*10000 + minute*100 + second
比如," 2009-03-09 12:32:12",其中:
注意这里都是用十进制来计算的.
---------------------------------------------
日期: 2009*10000 + 3*100 +9 --> 20090309
时间: 12 *10000 + 32*100 +12 --> 123212
---------------------------------------------
将时间和日期合并后,组成一个新的INTEGER数值:
十进制 十六进制
---------------------------------------------
20090309123212 --> 0x1245A3BD1C8C
注意:日期时间字段的数据是反向存储的.
所以存到数据文件里应该是: 8c 1c bd a3 45 12
3. 验证
下面我们可以来验证一下:
drop table if exists heyf;
create table heyf (id int ,curdate datetime) type myisam;
insert into heyf values (11,'2009-03-09 12:32:12');
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------
0000000 0bf9 0000 8c00 bd1c 45a3 0012 0000
000000d
----------------------------
其中:
f9 : 标志位
0b 00 00 00 : COL1 ,INT = 11
8c 1c bd a3 45 12 00 00 : 即日期.由于是反向存储,所以需要反向读取: 00001245a3bd1c8c
在这里我们看到,存储的内容与我们第2步中分析出来的结果是一致的!
4. 相关函数
4.1 十六进制转成十进制
select 0x1245a3bd1c8c +0 ;
--------------------
20090309123212
或
select conv("1245a3bd1c8c",16,10) ;
--------------------
20090309123212
4.2 十进制转成十六进制
select conv(20090309123212,10,16) ;
--------------------
1245A3BD1C8C