亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

mysql字符超過767

在插入文件到分區表得時候報錯,說MySQL里最大只能是767

正在回答

1 回答


大家應該知道InnoDB單列索引長度不能超過767bytes,聯合索引還有一個限制是長度不能超過3072。

mysql>?CREATE?TABLE?`tb`?(??

????->???`a`?varchar(255)?DEFAULT?NULL,??

????->???`b`?varchar(255)?DEFAULT?NULL,??

????->???`c`?varchar(255)?DEFAULT?NULL,??

????->???`d`?varchar(255)?DEFAULT?NULL,??

????->???`e`?varchar(255)?DEFAULT?NULL,??

????->???KEY?`a`?(`a`,`b`,`c`,`d`,`e`)??

????->?)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;??

ERROR?1071?(42000):?Specified?key?was?too?long;?max?key?length?is?3072?bytes?

可以看到,由于每個字段占用255*3, 因此這個索引的大小是3825>3072,報錯。

為什么3072

???????? 我們知道InnoDB一個page的默認大小是16k。由于是Btree組織,要求葉子節點上一個page至少要包含兩條記錄(否則就退化鏈表了)。

? ? ? ? ?所以一個記錄最多不能超過8k。

??????? 又由于InnoDB的聚簇索引結構,一個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。

???????? 由于需要預留和輔助空間,扣掉后不能超過3500,取個“整數”就是(1024*3)。?

單列索引限制

???????? 上面有提到單列索引限制767,起因是256×3-1。這個3是字符最大占用空間(utf8)。但是在5.5以后,開始支持4個字節的uutf8。255×4>767, 于是增加了一個參數叫做 innodb_large_prefix。

???????? 這個參數默認值是OFF。當改為ON時,允許列索引最大達到3072。

可以看到默認行為是建表成功,報一個warning,并且將長度階段為255。

注意要生效需要加row_format=compressed或者dynamic ? ? 百度了一下 ?

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
走近大數據之Hive進階
  • 參與學習       30387    人
  • 解答問題       49    個

Hive數據操作,查詢及Hive編程接口,開發Hive的自定義函數

進入課程

mysql字符超過767

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號