今天瀏覽mysql的官網文檔,無意中看到如圖划線部分一句話,引起了我的興趣,所以決定做實驗官方所言。
條例1.創建數據表時,所有字段定義時"寬度之和"不得超過65535字節;
條例2.理論上的char(255)、varchar(65532)、varbinary(65532)字段最大值定義,實際情形是達不到的,因為首先要遵守條例1。
實驗測得規律(MySQL5.7):
tinyint 定義占1字節
smallint 定義占2字節
int 定義占4字節
char(2) 定義占2*3=6字節(當存儲3個中文時每字占3字節,所以占6字節)
char(3) 定義占3*3=9字節
varchar(10) 定義占10*3=30字節(當存儲10個中文時每字占3字節,所以占30字節)
varbinary(8) 定義占8+1=9字節
text 定義占10字節
mediumtext 定義占10+1=11字節
decimal(10,2) 定義占5字節
實驗
實驗1:只有一個ch20字段 drop table `tab4`; create table `tab4`( `ch20` varbinary(65532) COMMENT '定義占65532字節' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='實驗表';
實驗2:添加 `num1` tinyint 字段 drop table `tab4`; create table `tab4`( `num1` tinyint, `ch20` varbinary(65531) COMMENT '定義占65532-1 = 65531 字節' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='實驗表';
實驗3:再添加 `num2` int 字段 drop table `tab4`; create table `tab4`( `num1` tinyint, `num2` int, `ch20` varbinary(65527) COMMENT '定義占65532-1-4 = 65527 字節' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='實驗表';
實驗4:再添加 `chr1` char(4) 字段 drop table `tab4`; create table `tab4`( `num1` tinyint, `num2` int, `chr1` char(4), `ch20` varbinary(65515) COMMENT '定義占65532-1-4-4*3 = 65515 字節' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='實驗表';
實驗5:再添加 `content` text 字段 drop table `tab4`; create table `tab4`( `num1` tinyint, `num2` int, `chr1` char(4), `content` text, `ch20` varbinary(65505) COMMENT '定義占65532-1-4-4*3-10 = 65505 字節' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='實驗表';
小結:新添加的字段“取決於最大行大小”是指,`ch20` varbinary(65505) 與其它所有字段共享寬度,此消彼長;