2014-04-29 6 views
0

.MYD 파일에서 데이터를 읽는데 문제가 있습니다. 파일에서 직접 데이터를 읽어야하는 소프트웨어를 개발 중입니다. 나는 .frm을 제대로 읽을 수 있었지만, 나는 .myd와 어려움을 겪고있다. MyISAM 레코드 구조 .MYD 파일

나는 거의 내부 매뉴얼 ( https://dev.mysql.com/doc/internals/en/myisam.html)에서 모든 정보를 읽고 나는 또한 Understanding MyISAM record structure

그래서, 나는 그것이 가능한 데이터가 속한 열을 아는 것입니다 방법, 궁금 읽어 보시기 바랍니다. 내 데이터는 대부분 동적 파일 형식을 사용하는 중간 크기이며, BLOB의 길이와 데이터 자체의 길이가 3 바이트라는 것을 알고 있습니다. 예를 들어 10 개의 열이 있지만 그 중 2 개의 열만 데이터를 포함하는 경우 어떤 열에 .myd 파일의 데이터가 들어 있는지 어떻게 알 수 있습니까?

레코드 헤더와 플래그를 해석하는 데 문제가 있습니다.

감사합니다.

+0

여기서 임무를 수행하고 있습니다 ... Perhpas는 [임베디드 MySQL 서버 라이브러리] (https://dev.mysql.com/doc/refman/5.6/en/libmysqld)와 같은 기존 라이브러리 사용을 고려합니다. html). – RandomSeed

+1

이 문제를 해결하기 위해 노력하고 있습니다. MyISAM 레코드의 필드는 frm 파일에 나타나는 순서대로옵니다. 필드 길이가 있으므로 비어 있는지 알 수 있습니다. 소스 코드의 세부 사항보기 : http://bazaar.launchpad.net/~percona-dev/percona-myisam-recovery-tool/trunk/view/head:/parser.y – akuzminsky

답변

0

각 레코드는 플래그를 포함합니다. 각 플래그는 각 필드에 대해 하나씩 비트를 포함합니다.

비트 값이 0 인 경우 : 데이터를 포함합니다. 비트 값이 1이면 비어 있습니다.

테이블에 15 개의 필드가있는 경우 플래그는 2 바이트가됩니다. 15 비트, 각 필드 당 하나, 채우기 비트 하나. FA

비트에서 : 당신이 8 개 필드를 가지고있는 경우

예를 들어, 당신은 플래그가 01,111,010

(내 경우) 바이트 순서에 기반을, 당신은 마지막에 시작해야합니다. 이 예에서이 레코드의 경우 첫 번째, 세 번째 및 여덟 번째 필드에는 데이터가 포함되고 다른 필드는 비어 있습니다.

또한이 문서를 발견했습니다 : https://github.com/twitter/mysql/blob/master/storage/myisam/mi_dynrec.c#L1890 매우 유용합니다. 1890 번째 줄에는 각 블록 유형을 읽는 방법과 플래그를 포함하는 블록 유형이 나와 있습니다.