前段時間,看MySQL的行格式的時候,發現MySQL的單行限制以及超過限制時自動類型轉換。
1. MySQL版本:5.7.26
2. 關閉嚴格模式,否則直接報錯。
3. utf8編碼
-- 第一種情況 CREATE TABLE ts_test ( id int(11) unsigned NOT NULL auto_increment, a varchar(10000) DEFAULT NULL, b varchar(10000) DEFAULT NULL, n varchar(10000) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8; [Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -- 第二種情況 CREATE TABLE ts_test ( id int(11) unsigned NOT NULL auto_increment, a varchar(30000) DEFAULT NULL, b varchar(30000) DEFAULT NULL, c varchar(30000) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 3 warnings (0.26 sec) -- 表結構 mysql> show create table ts_test\G *************************** 1. row *************************** Table: ts_test Create Table: CREATE TABLE `ts_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `a` mediumtext, `b` mediumtext, `c` mediumtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
MySQL在建表的時候有個限制:MySQL要求一個行的定義長度不能超過65535。
(1)單個字段如果大於65535,則轉換為TEXT 。
(2)單行最大限制為65535,這里不包括TEXT、BLOB。
第一種情況:
單個字段長度:varchar(10000) ,字節數:10000*3 +(1 or 2) = 30000 ,小於65535,可以建立。
單行記錄長度:varchar(10000)*3,字節數:30000*3 +(1 or 2) = 90000,大於65535,不能建立,所以報錯
第二種情況:
單個字段長度:varchar(30000) ,字節數:30000*3+(1 or 2) = 90000 , 大於65535,需要轉換成TEXT,才可以建立。所以報warnings。
單行記錄長度:varchar(30000)*3,因為每個字段都被轉換成了TEXT,而TEXT沒有限制,所以可以建立表。
BY:liyy