跟大家聊聊数据库变长和定长的深层机制

Varchar字段类型:mysql字段值后缀空格没有实际意义,比较查询右侧空格会去掉。有些数据库字段值后缀空格是有实际含义的。

Char字段类型:所有数据库字段值后缀空格都没有实际意义,比较查询时右侧空格会去掉。

‘111 ‘和’111’查询条件查出来的结果是一样的。


MySQL:

数据组织形式,varchar是长度+内容,char是内容。空间占位是一样的,都是定义长度×字符集最大字节数。

Varchar 长度域长度,如果小于255字节,则为1字节,否则2字节。char没有长度位,内容加空格构成定义长度在字符集上最大长度。

比如create table aaa(a varchar(1),b char(1),c varchar(128),d char(128));mb4字符集,其数据库服务层格式就是:

1(长度域)+1(定长长度)*4(mb4字符集最大长度)+

1(定长长度)*4(mb4字符集最大长度)+

2(长度域)+128(定长长度)*4(mb4字符集最大长度)+

128(定长长度)*4(mb4字符集最大长度)

=1035字节

打开表生成一次,后续用模板复制,定义为varchar的要多拷贝1或2字节长度。


Innodb (mysql后台引擎):

varchar是依据实际长度截取,char 是最少保留128字节,最多需要从512字节往前到128字节,即定义长度,直到遇到空格。

Innodb 在compact格式,非redundant存储时,char和varchar都需要长度指示,char 实际长度不足,需要补足空格,varchar不需要补。

补空格,相当于预留空间,如果这个字段反复更新,有预留空间原地更新,否则需要重新插入新的。char和varchar在频繁更新的时候,更新记录达到最大,后续所有更新原地更新。char需要额外去空格处理。字段定长且长度小于一定值使用char,建议3。mb4字符集下,长度大于3,大多需要去空格9次以上,可以抵消varchar在数据库服务层设置长度的开销。其他情况应用varchar。

每天强制自己写些东西,拍摄制作视频,记录生活,思考探索学习一些东西。不断地学习,坚持下去,提高自己的认知,打开自己的思维,以后会有更多的方法和创新。

版权归作者老有理所有,未经作者允许不得转载本文内容,否则将视为侵权;转载或者引用本文内容请注明来源及原作者;对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权。欢迎大家对内容给予批评指正,请在下面留言,我会一一回答,谢谢大家的支持关照。认可的点赞支持!喜欢的话就点击关注!!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章