1 问题背景
数据库建表的时候经常遇到这个varchar,对这个知识点很疑惑。
2 前言
2021年8月22日重写本博客,原因是有读者评论“不懂别乱说”或者评论给出指正,笔者虚心接受并决定重写本博客。其实不必纠结于
varchar(10)
到底是什么意思,如果数据存储空间不足够导致插入数据失败,尽管加大存储空间就好了,比如varchat(64)
。欢迎广大读者评论指出不正确的地方。本博客参考于InnoDB引擎的底层原理的博客MySQL的varchar水真的太深了——InnoDB记录存储结构。笔者只花了几分钟的时间略看了一下自己关注的地方,有兴趣的小伙伴可以点击链接阅读。
本篇博客解释varchar的意思是基于MySQL5.7及以后的版本。
3 varchar(10)是什么意思
varchar(10)的意思是可以存储的最大字符串长度为10个字符,并且字符是变长的,如果不满10个就根据实际存储的字节来确定,即存储空间为0~10个字符。注意,不同编码方式1个英文字母占的字节是不同的,如下所示:
-
ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
-
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
-
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节
4 int(11)是什么意思
MySQL中的int型存储空间为4个字节。不论是int(10)还是int(11)等等,int型数据占4个字节存储空间。int(11)的意思是int型数据的显示宽度为11位,比如存储的是整型数值6,其二进制存储表示为110,那么如果用int(11)存储这个6,其二进制110
前面还会有若干个二进制位直到总共二进制位数为达到了11。这个可以配合字段的填充0
功能来解释。如下所示:
以下展示
填充0
的功能在navicat是无效果的,看不出有填充0:
建立一张表,如下:
插入若干条记录,如下:
如上所示,navicat是看不出填充0的效果的。得用原生的mysql客户端查看,如下所示:
可以看到,如果字段值的宽度不足11,并且如果开启了填充0的功能,那么可以看到字段值是会自动填充0直到达到int(11)括号中的数字的值。