Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112735
  • 博文数量: 53
  • 博客积分: 2062
  • 博客等级: 大尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 10:14
文章分类

全部博文(53)

文章存档

2011年(1)

2010年(3)

2009年(49)

我的朋友

分类: Mysql/postgreSQL

2009-05-31 10:20:17

1. 环境版本:

  OS : LINUX AS4

  MYSQL: 5.0.51a-log

  ENGINE : Myisam

  2. 分析

  date 类型共占3个字节(24位),范围'1000-01-01'到'9999-12-31' , 格式'YYYY-MM-DD' ,

  其中:从左到右数

  1~15位: 年(共15位)

  16~19位: 存储月(共4位)

  20~24位: 存储日(共5位)

  比如," 2009-03-09",其中:

  十进制 十六进制 二进制

  -----------------------------------

  2009 -> 0X7D9 -> 000 0111 1101 1001

  03 -> 0X03 -> 0011

  09 -> 0X09 -> 01001

  -----------------------------------

  将二进制组合后: 0000 1111 1011 0010 0110 1001

  ------------------------------

  0 F B 2 6 9

  即十六进制: 0FB269

  注意:日期字段的数据是反向存储的.

  3. 验证

  下面我们可以来验证一下:

  drop table if exists heyf;

  create table heyf (id int ,birthday date) type myisam;

  insert into heyf values (12,'2009-03-09');

  system hexdump /opt/mysql/data/test/heyf.MYD

  ----------------------------

  0000000 0cf9 0000 6900 0fb2

  0000008

  ----------------------------

  其中:

  f9 : 标志位

  0c 00 00 00 : COL1 ,INT = 12

  69 b2 0f : 即日期.由于是反向存储,所以需要反向读取:0FB269

  4. 相关函数

  4.1 十六进制转成十进制

  select 0xa +0 ;

  --------------------

  10

  或

  select conv("a",16,10) ;

  --------------------

  10

  4.2 十进制转成十六进制

  select conv(10,10,16) ;

  --------------------

  A

阅读(597) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~