- 레코드헤더
- 각 컬럼의 값
- (int)( (1+NULL을 허용하는 컬럼수+7)/8
- X bit
- Null bits
- Filler bits
oxf9 = 11111(filler bits) 00(null bits) 1 (X bit)
X bit는 그 레코드가 삭제 되었으면 0, 삭제되어있지 않으면 1이다.
NULL을 허용하는 컬럼수만큼 Null bits가 할당된다. 이 비트가 1이면 대응하는 컬럼의 값이 NULL이다.
Filler bits는 레코드헤더를 8비트 배수로 하기 때문에 1을 채워놓은 것에 불과하다.
따라서 Filler bits의 비트수는 다음과 같이 된다.
- 8- (X bit의 수(항상1) + Null bits의 수) %8
CHAR()의 경우에는 값의 바이트수가 컬럼의 정의크기보다 적을 경우 부족한 부분에 0x20이 채워진다.
CHAR()같이 문자를 처리하는 컬럼의 크기(바이트수)는 컬럼의 캐릭터셋에 좌우된다.
(eucjpms등의 캐릭터셋 경우에는 정의문자수*3배가 필요하다. )
컬럼의 정보는 frm파일에 기록되어있으므로 MySQL자신은 MYD를 읽어 들일 때에는 이미 컬럼의 수와 정의를 알고 있다. 따라서 여기 글 이상의 정보는 MYD파일에는 있지 않다.
실제로 MYD파일을 보면 다음과 같이 된다.
MYD파일
mysql> create table fixed (a char(3), b char(5) ) default charset=eucjpms;
mysql> insert into fixed values( 'abc', 'def'), ('ghi', NULL) ;
shell> hexdump -C fixed.MYD
f9 /61 62 63/ 20 20 20/ 20 20 20 /64 65 66 20 20 /20 20 20 20 20/20 20 20 20 20
fd /67 68 69/20 20 20/ 20 20 20 /20 20 20 20 20 /20 20 20 20 20/20 20 20 20 20