Table Definition Pages

Page Header

Name Length Type Description
Page Signature 2 bytes UINT 16 LE Always 0x0102. Identifies this as a table definition page.
2 bytes UINT 16 LE
  • the value 'VC' for Jet 3
  • the number of free bytes on this page for Jet 4
Next Page 4 bytes UINT 32 LE If the table definition is too long to fit on a single page, this field contains a pointer to the next page. The next page will again be a table definition page with a header similar to this one, and the data from this page and the next must be concatenated.

Table Definition data

Table Definition Length 4 bytes UINT 32 LE The total length of the table definition.
Unknown 4 bytes
Jet 4 only
??? Unknown field, Jet 4 and later only
Number of rows 4 bytes UINT 32 LE The total number of rows in the table
Autonumber 4 bytes UINT 32 LE The next value for the autonumber field
Autonumber Increment 4 bytes
Jet 4 only
UINT 32 LE Jet 4 only, probably the amount that the autonumber is increased everytime (I haven't tested this)
Complex Autonumber 4 bytes UINT 32 LE Jet 4 only. On Access 2007 and later, this contains the Autonumber for complex fields (shared across all complex fields). Unknown for earlier versions.
Unknown 4 bytes UINT 32 LE Jet 4 only
Unknown 4 bytes UINT 32 LE Jet 4 only
Table Type / Flags? 1 bytes UINT 8

The type of the table, or maybe some table flags? Known values:

  • 0x4e user table
  • 0x53 system table
Next Column Id 2 bytes UINT 16 LE The Column Id that the next column to be created will have. Incremented every time a column is created, never decremented. Equal to the total number of columns in the table including deleted columns.
Variable Columns 2 bytes UINT 16 LE The number of variable length columns in the table
Column Count 2 bytes UINT 16 LE The number of columns in the table
Index Count 4 bytes UINT 32 LE The total number of indexes in the table, including those that aren't real indices.
Real Index Count 4 bytes UINT 32 LE The number of real indices in the table
Row Page Map 4 bytes UINT 32 LE A record pointer to a page bitmap of all pages that contain rows in this table (excluding LVAL pages)
Free Space Page Map 4 bytes UINT 32 LE A record pointer to a page bitmap for pages containing free space (for inserting rows).

for every real index :

Unknown A1 4 bytes ???
Index Row Count 4 bytes UINT 32 LE Unknown
Unknown A2 4 bytes ??? Jet 4 only, always 0

for every current column:

Type 1 byte UINT 8 The column type. Known types are:
  • 1 Boolean
  • 2 Integer, 8 bit
  • 3 Integer, 16 bit
  • 4 Integer, 32 bit
  • 5 Fixed Point Number, 64 bit (Money / Currency)
  • 6 Floating Point Number, 32 bit (single)
  • 7 Floating Point Number, 64 bit (double)
  • 8 Date/Time, 64 bit, (stored as double)
  • 9 Binary (up to 255 bytes)
  • 10 Text (up to 255 characters)
  • 11 OLE (long binary)
  • 12 Memo (long Text)
  • 15 GUID (global unique identifier)
  • 16 Fixed Point, 96 bit, stored in 17 bytes
  • 18 Complex field (32 bit integer key)
Unknown 4 bytes
Jet 4 only
UINT 32 LE Jet 4 only, first unknown definition block
Column Id 2 bytes UINT 16 LE A unique number for every column, doesn't change
Variable Column Number 2 bytes UINT 16 LE The offset in the variable length columns list
Column Index 2 bytes UINT 16 LE The index of this column in the table
Various 4 bytes (Jet 4)
6 bytes (Jet 3)
In Jet 3, textual columns:
  • 2 bytes collation (LCID = Localisation ID)
  • 2 bytes code page
  • 2 bytes unknown

Jet 3, decimal columns:

  • 2 bytes unknown
  • 1 byte Maximum total number of digits
  • 1 byte Number of decimal digits
  • 2 bytes unknown

Jet 4, textual columns:

  • 2 bytes collation
  • 1 byte unknown
  • 1 byte collation version number ?

Jet 4, decimal columns:

  • 1 byte Maximum total number of digits
  • 1 byte Number of decimal digits
  • 2 bytes unknown

Jet 4, complex columns:

  • 4 bytes, TDEF page number of the complex field
Column Flags 2 bytes (Jet 4)
1 byte (Jet 3)
UINT 16 LE
UINT 8

Flags for various column properties:

  • 0x0001 fixed length column
  • 0x0002 can be null
  • 0x0004 autonumber
  • 0x0008 unknown
  • 0x0010 replication related field (or hidden?). These columns start with "s_" or "Gen_" (the "Gen_" fields are for memo fields)
  • 0x0020 unknown
  • 0x0040 automatic GUID
  • 0x0080 hyperlink. Syntax is "Link Title#http://example.com/somepage.html#" or "#PAGE.HTM#"
  • 0x0100 Compressed Unicode (Note: Memo is always compressed unicode!)
  • 0x1000 Marks the modern package type for OLE fields
  • 0x4000 Unknown, occurs together with 0x8000 in a formula type TEXT column
  • 0x8000 Unknown

Note: Complex fields always have 0x0007 as flag.

Unknown 4 bytes
(Jet 4 only)
??? Jet 4 only, usually 0
Fixed Offset 2 bytes UINT 16 LE The offset for fixed length columns
Length 2 bytes UINT 16 LE
  • field size for fixed width columns
  • maximum length for variable length columns,
  • 0 for MEMO and OLE
  • for every column:

    Name Length 2 bytes (Jet 4)
    1 byte (Jet 3)
    UINT 16 LE
    UINT 8
    The length in bytes of the column name
    Column name The column name in the default codepage (Jet3) or UCS-2 (Jet 4)

    for every real index:

    Unknown B1 4 bytes
    (Jet 4 only)
    ??? Jet 4 only
    Always one of two values:
    • 0
    • 1923

    for 10 times:

    Column Id 2 bytes UINT 16 LE The Column Id of the indexed column, or 0xFFFF if the index doesn't have so many columns
    Flags 1 byte UINT 8 Index column flags. Only known flag is 0x01 for ascending order.

    Unknown B2 4 bytes ???
    First index page 4 bytes UINT 32 LE Points to the first index page
    Flags 2 bytes (Jet 4)
    1 byte (Jet 3)
    UINT 16 LE
    UINT 8
    Index flags.
    • 0x01 Unique
    • 0x02 IgnoreNuls
    • 0x08 Required
    Unknown B3 4 bytes ??? Jet 4 only
    Unknown B4 4 bytes ??? Jet 4 only
    Always 0

    for every index (including those that aren't real):

    Unknown C1 4 bytes
    Jet 4 only
    UINT 32 LE Jet 4 only, first unknown definition block
    Always one of two values:
    • 0
    • 1625
    Index Number 4 bytes UINT 32 LE The number of the index (not necessarily sequential)
    Index Column Number 4 bytes UINT 32 LE An index into the index column list (????)
    Unknown C2 1 byte UINT 32 LE
    • 0x00 for real indices
    • 0x01 ??
    • 0x02 ??
    Unknown C3 4 bytes UINT 32 LE

    0xffffffff for real indices

    small integer (most often 2, only once 0, usually less than 30) otherwise

    Unknown C4 4 bytes ??? Always 0 for real indices
    Unknown C5 2 bytes ???

    Probably some flags

    Almost always 0x00000404 for real indices (single exception)

    Combinations of the following flags otherwise:

    • 0x0001 Unknown flag 1
    • 0x0100 Unknown flag 2
    Index Type 1 byte UINT 8
    • 0x00 normal index
    • 0x01 primary key index
    • 0x02 non-real index
    Unknown C6 4 bytes ???

    Jet 4 only

    Always 0

    for every index:

    Name Length 2 bytes (Jet 4)
    1 byte (Jet 3)
    UINT 16 LE
    UINT 8
    The length in bytes of the index name
    Column name The index name in the default codepage (Jet3) or UCS-2 (Jet 4)

    until column id is 0xFFFF:

    Column Id 2 bytes UINT 16 LE The Column Id of a variable length column
    Arg 1 4 bytes UINT 32 LE Some argument
    Arg 2 4 bytes UINT 32 LE Some other argument