Each table is described by a table definition on one or more TDEF pages (type
02). This page follows MDB Tools’ HACKING.md; offsets are
hexadecimal and numbers little-endian. Pages and rows are on
header, pages and rows.
TDEF page header
| Offset | Size | Field |
|---|---|---|
00 | 1 | Page type 02. |
01 | 1 | Unknown, 01. |
02 | 2 | Jet 3: VC. Jet 4: free space − 8. |
04 | 4 | Next TDEF page of this table, or 0. |
A long definition continues on the next page after its 8-byte header. The table block below starts at offset 8.
Table block
| Jet 3 | Jet 4 | Size | Field |
|---|---|---|---|
00 | 00 | 4 | Length of the definition. |
| – | 04 | 4 | Jet 4: a tag, 1625. |
04 | 08 | 4 | Number of rows. |
08 | 0C | 4 | Next autonumber value. |
| – | 10 | 1 | Jet 4: 01 when autonumbering is on. |
| – | 11 | 3 | Jet 4: unknown, zero. |
| – | 14 | 4 | Jet 4: autonumber for complex columns. |
| – | 18 | 8 | Jet 4: unknown; uninitialised leftovers. |
0C | 20 | 1 | Table type: 4E (N) user table, 53 (S) system table. |
0D | 21 | 2 | Highest column ID. |
0F | 23 | 2 | Number of variable-length columns. |
11 | 25 | 2 | Number of columns. |
13 | 27 | 4 | Number of logical indexes. |
17 | 2B | 4 | Number of physical indexes. |
1B | 2F | 4 | Pointer to the usage map of used pages. |
1F | 33 | 4 | Pointer to the usage map of free pages. |
Then, in order: index statistics (8 bytes per physical index in Jet 3, 12 in Jet 4);
the column definitions; the column names (Jet 3: 1-byte length
and the name; Jet 4: 2-byte length and UCS-2); the
physical index blocks; the logical index blocks; the index
names; and a list of usage-map entries (column number, used pages, free pages) ended
by column number FFFF.
Column definitions
| Jet 3 | Jet 4 | Size | Field |
|---|---|---|---|
00 | 00 | 1 | Column type. |
| – | 01 | 4 | Jet 4: tag, 1625. |
01 | 05 | 2 | Column number. |
03 | 07 | 2 | Index among variable-length columns. |
05 | 09 | 2 | Column ID. |
07 | – | 2 | Jet 3: a flag word. |
09 | – | 2 | Jet 3: sort order. |
0B | 0B | 2 | Precision and scale for numeric columns, or the code page for text. |
| – | 0D | 2 | Jet 4: collation variant and text sort version. |
0D | 0F | 1 | Column flags. |
| – | 10 | 1 | Jet 4: more flags. |
| – | 11 | 4 | Jet 4: unknown, zero. |
0E | 15 | 2 | Offset of a fixed-length column in the row. |
10 | 17 | 2 | Column length. |
A column definition is 18 bytes in Jet 3 and 25 in Jet 4.
Column types
| Code | Type | Stored as |
|---|---|---|
01 | Boolean | A bit in the null mask |
02 | Byte | 8 bits |
03 | Integer | 16 bits |
04 | Long integer | 32 bits |
05 | Currency | 64 bits (the notes give no scale) |
06 | Single | 32-bit float |
07 | Double | 64-bit float |
08 | Date/time | 64-bit double: days since 30 December 1899, with the time as a positive fraction of the day |
09 | Binary | Up to 255 bytes |
0A | Text | Up to 255 characters |
0B | OLE object | Long binary, memo header |
0C | Memo | Long text, memo header |
0D, 0E | – | Not column types; both engines reject them |
0F | Replication ID | 16-byte GUID |
10 | Numeric | 17 bytes, a scaled decimal |
11 | Big binary | Fixed binary, declared length 4,000 |
12 | Complex | 32-bit key of a complex column: multi-valued fields, version history and attachments (ACE) |
13 | Big integer | 64 bits (ACE) |
14 | Extended date/time | 42 bytes (Access 2019) |
Column flags
| Bit | Meaning |
|---|---|
01 | Fixed-length column |
02 | Can be updated |
04 | Autonumber (long) |
08 | Not seen |
10 | Hidden column maintained by the system |
20 | Windows security identifier |
40 | Autonumber (GUID) |
80 | Hyperlink |
Indexes
Physical index (Jet 3: 39 bytes; Jet 4: 52 bytes): Jet 4 starts with a 4-byte tag (1923); then 10 entries of a 2-byte column number and a 1-byte order; the used-pages map pointer (4); the first index page (4); Jet 4 adds 4 unknown bytes; the index flags (1); Jet 4 adds a complex-index byte and 4 zero bytes.
Logical index (Jet 3: 20 bytes; Jet 4: 28): Jet 4 starts with a
4-byte tag (1625); then the index number (4), the physical index number (4), the
related table’s type (1), the related index number (4, FFFFFFFF when not a
foreign key), the related table’s page (4), cascade updates (1), cascade deletes (1)
and the index type (1: 01 primary key, 02 foreign key); Jet 4
ends with 4 zero bytes.
| Index flag | Meaning |
|---|---|
01 | Unique |
02 | Ignore nulls |
08 | Required |
80 | Set by Access 2000 and later; meaning unknown |
The index pages themselves: leaf pages (type 04) hold one entry per
row; intermediate pages (type 03) hold the indexed columns, a page and
row reference and a child page pointer. Entries after the first on a page may omit
a prefix they share with the first entry (its length is given in the page header).