● MySQL Server最多只允許4096個字段
● InnoDB 最多只能有1000個字段
● 字段長度加起來如果超過65535,MySQL server層就會拒絕創建表
● 字段長度加起來(根據溢出頁指針來計算字段長度,大于40的,溢出,只算40個字節)如果超過8126,InnoDB拒絕創建表
其實MySQL在計算字段長度的時候并不是按照字段的全部長度來記的。列字段小于40個字節的都會按實際字節計算,如果大于20 * 2=40 字節就只會按40字節。
創建一個300個字段長度類型為varchar(30)的表,在創建時不會創建成功。因為varchar(30)沒有超過20*2,那么總長度就是300*30=9000 > 8126就會創建失敗。
創建一個150個字段長度類型為varchar(100)的表可以創建成功。因為varchar(100) 大于了20*2那么就只會按40計算 總長度就是150*20*2=6000 < 8126 就會創建成功。
varchar(40) uft8 理論上能建立203列(8126/40) 但是實際上只建立了 196列
● 表結構中根據Innodb的ROW_FORMAT的存儲格式確定行內保留的字節數(20 VS 768),最終確定一行數據是否小于8126,如果大于8126,報錯。
MySQL官方手冊就可以查詢到, 對于一行記錄最大的限制是65535字節。為什么是65535?規定一行數據里面字段長度定義有64k;
有了65535的限制以后還有一個8126的限制是為什么呢?
MySQL是分兩層的,
MySQL Server層 + 存儲引擎層。
第2個問題其實是MySQL除了在Server層做了一次限制還會在Innodb存儲引擎層在做一次限制。
innodb為了保證B+TREE是一個平衡樹結構,強制要求一條記錄的大小不能超過一個頁大小的一半。這也就是我們上面看到的第二個錯誤。
下面是innodb B+樹的結構,我們可以想象一下二分查找時,一個頁的只有一條數據會是什么樣子?
每個頁只有一條數據的查找就變成了鏈表查找了。這樣就沒有二分查找的意義了。
而MySQL中默認的頁大小是16K,16K的一半是8196字節減去一些元數據信息就得出了8126這個數字。
還可以看看
其他文章,謝謝您的閱讀。
網站申明:系本文編輯轉載,來源于網絡,目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責,所有權歸屬原作者。如內容、圖片有任何版權問題,請
聯系我們刪除。