技术开发 频道

MYSQL-数据类型存储-DATETIME

  【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

0
相关文章