MySQL frm 格式分析

原文:http://www.chenyajun.com/2009/03/14/2472

虽然官方文档有,但还是决定实际看一个。

.frm文件用了存储表定义的文件

CREATE TABLE `0010_folder_1` (
  `ufid` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(96) COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `foldername` VARCHAR(64) COLLATE utf8_general_ci NOT NULL DEFAULT '',
  `total` INTEGER(10) UNSIGNED NOT NULL DEFAULT '0',
  `unread` INTEGER(10) UNSIGNED NOT NULL DEFAULT '0',
  `todo` INTEGER(10) UNSIGNED NOT NULL DEFAULT '0',
  `space` BIGINT(10) UNSIGNED NOT NULL DEFAULT '0',
  `type` TINYINT(3) UNSIGNED NOT NULL DEFAULT '2',
  PRIMARY KEY (`ufid`),
  KEY `idxemail` (`email`(16))
)ENGINE=InnoDB
AUTO_INCREMENT=66 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

先是 64 字节 的fileinfo 区域。这个和官方上基本一样。
fileinfo
0000000: fe
0000000: 01 
0000002: 0a
0000003: 09 
0000004: 03
0000005: 00 
0000006: 0010 
0000008: 0100 
000000a: 0030 0000 
000000e: c202
0000010: 0002 
0000012: 0000 0000 
0000016: 0000 0000 
000001a: 00
000001b: 02 
000001c: 3b00 
000001e: 0900
0000020: 00
0000021: 05
0000022: 0000 0000 
0000026: 21
0000027: 00 
0000028: 00
0000029: 00 0000 0000 00
000002f: c2 0200 00
0000033: d2 c300 00
0000037: 10 0000 00
000003b: 00 00
000003d: 00 
000003e: 0000

0000040: 2f2f 0000 2000 0000 0000 0000 0000 0000
0000050: 0000 0000 0000 0000 0000 0000 0000 0000
0000060: 0000 0000 0000 0000 0000 0000 0000 0000
………
………
………
0000fe0: 0000 0000 0000 0000 0000 0000 0000 0000
0000ff0: 0000 0000 0000 0000 0000 0000 0000 0000

然后是 key 定义部分
keybuff
0001000: 02				key 的数量
0001001: 02 				构成 key 的字段总数
0001002: 0000 
0001004: 1300 				PRIMARY 和 idxemail 部分总长为 19

0001006: 0000 				flags
0001008: 0800 				key_length (ufid 8 bytes)
000100a: 01				key_parts
000100b: 00 				algorithm
000100c: 0000 				block_size

000100e: 0180				key_part->fieldnr+1+FIELD_NAME_USED (32768 + 1)
0001010: 0100 				offset
0001012: 00
0001013: 42 00				key_type
0001015: 08 00				length


0001017: 29 00				flags
0001019: 30 00				key_length (email, 16 * 3 = 48)
000101b: 01 				key_parts
000101c: 00				algorithm
000101d: 00 00				block_size

000101f: 02 80				32768 + 2
0001021: 09 00				offset (1 + 8 = 9)
0001023: 00				
0001024: 0000				key_type
0001026: 3000				length

0001028: ff
0001029: 50 5249 4d41 5259 		PRIMARY
0001030: ff
0001031: 69 6478 656d 6169 6c		idxemail
0001039: ff 
000103a: 00

000103b: 00 0000 0000
0001040: 0000 0000 0000 0000 0000 0000 0000 0000
0001050: 0000 0000 0000 0000 0000 0000 0000 0000
0001060: 0000 0000 0000 0000 0000 0000 0000 0000
0001070: 0000 0000 0000 0000 0000 0000 0000 0000
0001080: 0000 0000 0000 0000 0000 0000 0000 0000
………
00012c0: 0000

00012c2: 0000 0000 0000 0000 0000 0000 0000
………
00013b0: 0000 0000 0000 0000 0000 0000 0000 0000
00013c0: 0000 0000 0000 0000 0000 0000 0000 0000
00013d0: 0000 0000 0000 0000 0000 0000 0000 0000
00013e0: 0000 0000 0000 0000 0000 0000 0000 0000
00013f0: 0000 0000 0000 0000 0000 0000 0000 0000
………
0001470: 0000 0000 0000 0000 0000 0000 0000 0000
0001480: 0000 0000 0000 0000 0000 0000 0000 0000
0001490: 0000 0000 0000 0000 0000 0000 0000 0000
00014a0: 0000 0000 0000 0000 0000 0000 0000 0000
00014b0: 0000 0000 0000 0000 0000 0000 0000 0000
00014c0: 0002 
00014c2: 0000 0600 4d79 4953 414d 0000 0000
00014d0: 0000 0000 0000 0000 0000 0000 0000 0000
00014e0: 0000 0000 0000 0000 0000 0000 0000 0000
00014f0: 0000 0000 0000 0000 0000 0000 0000 0000
0001500: 0000 0000 0000 0000 0000 0000 0000 0000
0001510: 0000 0000 0000 0000 0000 0000 0000 0000
0001520: 0000 0000 0000 0000 0000 0000 0000 0000
0001530: 0000 0000 0000 0000 0000 0000 0000 0000
0001540: 0000 0000 0000 0000 0000 0000 0000 0000
0001550: 0000 0000 0000 0000 0000 0000 0000 0000
………
00017c0: 0000 0000 0000 0000 0000 0000 0000 0000
00017d0: 0000 0000 0000 0000 0000 0000 0000 0000
………
………
………
………
………
0001ff0: 0000 0000 0000 0000 0000 0000 0000 0000


formhead
0002000: 5802 	(后面的总长度为 600)
0002002: 0010 0000 0000 0000 0000 0000 0000
0002010: 0000 0000 0000 0000 0000 0000 0000 0000
0002020: 0000 0000 0000 0000 0000 0000 0000 0000
0002030: 0000 0000 0000 0000 0000 0000 0000 0000
0002040: 0000 0000 0000 0000 0000 0000 0000 0000
0002050: 0000 0000 0000 0000 0000 0000 0000 0000
0002060: 0000 0000 0000 0000 0000 0000 0000 0000
0002070: 0000 0000 0000 0000 0000 0000 0000 0000
0002080: 0000 0000 0000 0000 0000 0000 0000 0000
0002090: 0000 0000 0000 0000 0000 0000 0000 0000
00020a0: 0000 0000 0000 0000 0000 0000 0000 0000
00020b0: 0000 0000 0000 0000 0000 0000 0000 0000
00020c0: 0000 0000 0000 0000 0000 0000 0000 0000
00020d0: 0000 0000 0000 0000 0000 0000 0000 0000
00020e0: 0000 0000 0000 0000 0000 0000 0000 0000
00020f0: 0000 0000 0000 0000 0000 0000 0000 0000

0002100: 01		screens
0002101: 00 			
0002102: 0800 		elements
0002104: 7b00 		info_length
0002106: 1f02 		totlength (543,所有字段长度)
0002108: 0000 		no_empty
000210a: 0002 		reclength	(512)
000210c: 3500 		n_length	(53,2 + 所有字段名称长度 + 字段个数)
000210e :0000		int_count
0002110: 0000 		int_parts
0002112: 0000 		int_length
0002114: 0000 		time_stamp_pos
0002116: 5000 		80
0002118: 1600 		22
000211a: 0000 		null_fields
000211c: 0000 		com_length
000211e: 0000

没搞清楚 screens 是干什么用的
screens
0002120: 7b				length
0002121: 00 				
0002122: 09				fields_on_screen + 1
0002123: 08				fields_on_screen
0002124: 02				start_row-2
0002125: 14 				cols >> 2
0002126: 29				(cols >> 1) +1
0002127: 20 2020 2020 2020 2020
0002130: 2020 2020 2020 2020 2020 2020 2020 2020
0002140: 2020 2020 2020 2020 2020 2020 2020 2000

0002150: 04 				row
0002151: 00 
0002152: 05				filed->field_name + 1
0002153: 75 6669 6400 			ufid

0002158: 05 
0002159: 00 
000215a: 06
000215b: 65 6d61 696c00

0002161: 06 
0002162: 00 
0002163: 0b
0002164: 666f 6c64 6572 6e61 6d65 00

000216f: 07 
0002170: 00 
0002171: 06
0002172: 746f 7461 6c00

0002178: 08 
0002179: 00 
000217a: 07
000217b: 75 6e72 65616400

0002182: 09 
0002183: 00 
0002184: 05
0002185: 74 6f64 6f00

000218a: 0a 
000218b: 00 
000218c: 06
000218d: 73 70616365 00

0002193: 0b 
0002194: 00 
0002195: 05
0002196: 7479 7065 00

字段定义

pack_fields

ufid
000219b: 04 			row
000219c: 05			col			字段名字长度 + 1
000219d: 14 			sc_length
000219e: 1400			length (20)
00021a0: 01 00 00		recpos
00021a3: 42 00			pack_flag
00021a5: 0f 00			unireg_check
00021a7: 00 			interval_id
00021a8: 08			sql_type		MYSQL_TYPE_LONGLONG
00021a9: 21			charset_number		my_charset_utf8_general_ci
00021aa: 0000 			comment_length

email
00021ac: 05
00021ad: 06 
00021ae: 49			sc_length
00021af: 2001 			length (288)
00021b1: 09 0000 		recpos (1 + 8 = 9)
00021b4: 0000 			pack_flag
00021b6: 0000			unireg_check
00021b8: 00			interval_id
00021b9:0f 			sql_type		MYSQL_TYPE_VARCHAR
00021ba:21
00021bb:00 00

foldername
00021bd:06 
00021be:0b
00021bf: 44			sc_length
00021c0: c000			length (192)
00021c2: 2b01 00		recpos (299 = 9 + 96* 3 + 1 + 1)
00021c5: 00 00			pack_flag
00021c7: 00 00			unireg_check
00021c9: 00			interval_id
00021ca: 0f			sql_type		MYSQL_TYPE_VARCHAR
00021cb: 21
00021cc: 0000

total
00021ce: 07
00021cf: 06
00021d0: 0a			sc_length
00021d1:0a 00			length (10)
00021d3: ec 0100 		recpos (492 = 299 + 64*3 + 1)
00021d6: 1a00 			pack_flag
00021d8: 0000 			unireg_check
00021da: 00			interval_id
00021db: 03 			sql_type		MYSQL_TYPE_LONG
00021dc: 21
00021dd:00 00

unread
00021df: 08			
00021e0: 07			
00021e1: 0a 			sc_length
00021e2: 0a00			length (10)
00021e4: f001 00		recpos (496 = 492 + 4)
00021e7: 1a 00			pack_flag
00021e9: 00 00			unireg_check
00021eb: 00 			interval_id
00021ec: 03			sql_type		MYSQL_TYPE_LONG
00021ed: 21
00021ee: 0000

todo
00021f0: 09
00021f1: 05 
00021f2: 0a			sc_length
00021f3: 0a 00			length (10)
00021f5: f4 0100 		recpos (500 = 496 + 4)
00021f8: 1a00 			pack_flag
00021fa: 0000 			unireg_check
00021fc: 00			interval_id
00021fd: 03			sql_type		MYSQL_TYPE_LONG
00021fe: 21
00021ff: 00 00

Space

0002201: 0a 
0002202: 06
0002203: 0a 			sc_length
0002204: 0a00 			length (10)
0002206: f801 00		recpos (504 = 500 + 4)
0002209: 42 00			pack_flag
000220b: 00 00			unireg_check
000220d: 00 			interval_id
000220e: 08			sql_type		MYSQL_TYPE_LONGLONG
000220f: 21
0002210: 0000

type
0002212: 0b
0002213: 05 
0002214: 03			sc_length
0002215: 03 00			length (3)
0002217: 00 0200 		recpos (512 = 504 + 8)
000221a: 0a00 			pack_flag
000221c: 0000 			unireg_check
000221e: 00			interval_id
000221f: 01			sql_type		MYSQL_TYPE_TINY
0002220: 21
0002221: 00 00


0002223: ff 
0002224: 7566 6964 ff					ufid
0002229: 65 6d61 696c ff				email
000222f: 66 6f6c 6465 726e 616d 65ff			foldername
000223a: 746f 7461 6cff					total
0002240: 756e 7265 6164 ff				unread
0002247: 74 6f64 6fff 					todo
000224c: 7370 6163 65ff 				space
0002252: 7479 7065 ff00   				type


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值