官方地址: http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html
每個表中硬性規定,就是最多只允許存儲4096個列,有效的最大值可能小於給定的表,確切的限制取決於幾個相互作用的因素。
1.每個表(不關心存儲引擎)單行最大值占65535字節。存儲引擎可能會在這個限制上放置額外的約束,以減少有效的最大行大小。
最大行大小限制了咧的數量(可能存儲大小),因為所有列的總長度不能超過這個大小
例如: 每個UTF8字符需要3個字節。
所以一個char(255) UTF8 字符集的列。服務器必須為每個值分配 255 x 3 = 765字節,因此,一個表不能包含65535 / 765 = 85 個這樣的列。
可變長度列的存儲包括長度和字節。這是對行大小的評估。
例如,一個varchar(255) UTF8字符集的列需要兩個字節來存儲值得長度。
所以每個值可以占用767個字節。
BLOB 和 TEXT 字段計數, 因為它們的內容分別存儲在該行的其余部分中。
對每行大小的限制,從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)使用不同數量的頁面頭部和尾部的數據,它影響行的存儲量。
本文出自 “會飛的螞蟻” 博客,謝絕轉載!
Tags: 服務器 number 最大值 記錄 空間
文章來源: