官方地址: http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html html
每一個表中硬性規定,就是最多隻容許存儲4096個列,有效的最大值可能小於給定的表,確切的限制取決於幾個相互做用的因素。mysql
1.每一個表(不關心存儲引擎)單行最大值佔65535字節。存儲引擎可能會在這個限制上放置額外的約束,以減小有效的最大行大小。sql
最大行大小限制了咧的數量(可能存儲大小),由於全部列的總長度不能超過這個大小數據庫
例如: 每一個UTF8字符須要3個字節。服務器
因此一個char(255) UTF8 字符集的列。服務器必須爲每一個值分配 255 x 3 = 765字節,所以,一個表不能包含65535 / 765 = 85 個這樣的列。ide
可變長度列的存儲包括長度和字節。這是對行大小的評估。spa
例如,一個varchar(255) UTF8字符集的列須要兩個字節來存儲值得長度。htm
因此每一個值能夠佔用767個字節。get
BLOB 和 TEXT 字段計數, 由於它們的內容分別存儲在該行的其他部分中。it
對每行大小的限制,從1到4 + 8字節的數值。
聲明列的NULL值能夠減小容許列的最大數量值。
對於MyISAM表,NULL列須要額外的空間來記錄它們的行是否值是NULL。每一個NULL列須要一個額外的,四捨五入到最近的字節
字節的最大行長度能夠計算以下:
row length = 1
+ (sum of column lengths)
+ (number of NULL columns + delete_flag + 7)/8
+ (number of variable-length columns)
delete_flag = 1 是靜態的格式表。靜態表在行記錄中使用一個bit表示,指示該行是否已經被刪除的標識位。
delete_flag 0 動態表,由於flag標識 存儲的動態行標頭。
對於MyISAM表格式的信息,請參見第16.2.3,「MyISAM表的存儲格式」。
在InnoDB表中,是NULL列仍是非NULL列,存儲大小相同。因此前面的計算不適用。
下面的語句建立t1表成功,由於列須要 32,765 + 2 字節 和 32,766 + 2 字節,
他最大行大小爲 65535字節。
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
減小列長度從65533甚至更少能夠建立成功。
2.單個存儲引擎可能會對限制表列數施加額外的限制。例如:
(1)InnoDB 容許多達 1000個列。
(2)InnoDB 限制行大小略少於一半的數據庫頁爲4KB,8KB、16KB、32KB的頁面大小。對於一個64KB頁面大小限制,InnoDB行大小約16000字節。
針對可變長度列(VARBINARY, VARCHAR, BLOB, and TEXT) 行大小限制不一樣。
(3)不一樣的InnoDB存儲格式(COMPRESSED、REDUNDANT)使用不一樣數量的頁面頭部和尾部的數據,它影響行的存儲量。