一、MYSQL记录长度
MYSQL中规定:任何一条记录最长不能超过65535个字节。(Varchar永远达不到理论值)
Varchar的实际存储长度能达到多少呢?看字符集编码
Utf8下varchar 的实际顶配 :21844字符
GBK下的varchar的实际顶配 :32766字符
(a)求出varchar在utf8和 GBK下的实际最大值
1) UTF8:
1 create table my_utf8(name varchar(65535))charset utf8; --报错 提示21845 2 create table my_utf8(name varchar(21845))charset utf8; --21845*3+2=65535+2=65537 >65535 3 --所以 4 create table my_utf8(name varchar(21844))charset utf8; --21844*3+2=65534
2) GBK:
1 create table my_gbk(name varchar(65535)) charset gbk; --报错 提示32767 2 create table my_gbk(name varchar(32767)) charset gbk; --32767*2+2=65534+2=65536>65535 3 --所以 4 create table my_gbk(name varchar(32766)) charset gbk; --32766*2+2=65532+2=65534
报错结果如下所示:
另外,想用完整个65535个字节长度,增加一个tinyint字段即可
1 create table my_utf81( age tinyint , name varchar(21844))charset utf8; --tinyint 一个字节 2 3 create table my_gbk1( age tinyint, name varchar(32766)) charset gbk; --tinyint 一个字节
结果报错如下所示:
注意:MYSQL记录中:如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL(想释放NULL所占用的字节,必须保证所有的字段都不允许为空)
(b)释放NULL
1 create table my_utf82( age tinyint not null , name varchar(21844) not null )charset utf8; --tinyint 一个字节 2 3 create table my_gbk2( age tinyint not null , name varchar(32766)not null ) charset gbk; --tinyint 一个字节
另外 MYSQL中text文本字符串,不占用记录长度:额外存储。但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度:10个字节(保存数据的地址以及长度)。
(c)Text 占用十个字节长度
1 create table my_text( name varchar(21841) not null, content text )charset utf8; --21841*3+2=65523+2=65525 ,text占10,故为65535,但是报错
结果如下所示:(报错,原因为Text没有释放NULL,NULL也占用字符)
1 create table my_text( name varchar(21841) not null, content text not null )charset utf8; --释放Text中NULL
结果如下:成功,说明21841*3+2=65525,65535-65525=10,且未释放NULL报错,释放NULL结果可以运行,说明Text占用10个字节。