There is a hard limit of 4096 columns per table, but the effective maximum may be less for a given table. The exact limit depends on several interacting factors.
Every table (regardless of storage engine) has a maximum row size of 65,535 bytes. Storage engines may place additional constraints on this limit, reducing the effective maximum row size.
The maximum row size constrains the number (and possibly
size) of columns because the total length of all columns
cannot exceed this size. For example,
utf8 characters require up to three bytes
per character, so for a
CHAR(255) CHARACTER
SET utf8 column, the server must allocate 255
× 3 = 765 bytes per value. Consequently, a table
cannot contain more than 65,535 / 765 = 85 such columns.
Storage for variable-length columns includes length bytes,
which are assessed against the row size. For example, a
VARCHAR(255)
CHARACTER SET utf8 column takes two bytes to store
the length of the value, so each value can take up to 767
bytes.
BLOB and
TEXT columns count from one
to four plus eight bytes each toward the row-size limit
because their contents are stored separately from the rest
of the row.
Declaring columns NULL can reduce the
maximum number of columns permitted. For
MyISAM tables,
NULL columns require additional space in
the row to record whether their values are
NULL. Each NULL column
takes one bit extra, rounded up to the nearest byte. The
maximum row length in bytes can be calculated as follows:
row length = 1
+ (sum of column lengths)
+ (number of NULL columns + delete_flag + 7)/8
+ (number of variable-length columns)
delete_flag is 1 for tables with
static row format. Static tables use a bit in the row record
for a flag that indicates whether the row has been deleted.
delete_flag is 0 for dynamic
tables because the flag is stored in the dynamic row header.
For information about MyISAM
table formats, see Section 14.3.3, “MyISAM Table Storage Formats”.
For InnoDB tables, storage size
is the same for NULL and NOT
NULL columns, so the preceding calculations do not
apply.
The following statement to create table
t1 succeeds because the columns require
32,765 + 2 bytes and 32,766 + 2 bytes, which falls within
the maximum row size of 65,535 bytes:
mysql>CREATE TABLE t1->(c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)->ENGINE = MyISAM CHARACTER SET latin1;Query OK, 0 rows affected (0.02 sec)
The following statement to create table
t2 fails because the columns are
NULL and
MyISAM requires additional
space that causes the row size to exceed 65,535 bytes:
mysql>CREATE TABLE t2->(c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)->ENGINE = MyISAM CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
The following statement to create table
t3 fails because, although the column
length is within the maximum length of 65,535 bytes, two
additional bytes are required to record the length, which
causes the row size to exceed 65,535 bytes:
mysql>CREATE TABLE t3->(c1 VARCHAR(65535) NOT NULL)->ENGINE = MyISAM CHARACTER SET latin1;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
Reducing the column length to 65,533 or less permits the statement to succeed.
Individual storage engines might impose additional restrictions that limit table column count. Examples:
InnoDB permits up to 1000
columns.
InnoDB restricts row size
to something less than half a database page
(approximately 8000 bytes), not including
VARBINARY,
VARCHAR,
BLOB, or
TEXT columns.
Different InnoDB storage
formats (COMPRESSED,
REDUNDANT) use different amounts of
page header and trailer data, which affects the amount
of storage available for rows.
Each table has an .frm file that
contains the table definition. The definition affects the
content of this file in ways that may affect the number of
columns permitted in the table. For more information, see
Section E.10.5, “Limits Imposed by .frm File Structure”.

User Comments
Add your own comment.