Spec-Zone .ru
спецификации, руководства, описания, API
|
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 theused table type, not counting BLOBs, is 65535. You have to change somecolumns 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 theused table type, not counting BLOBs, is 65535. You have to change somecolumns 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".