likes
comments
collection
share

Mysql 中 varchar 类型

作者站长头像
站长
· 阅读数 11

varcharMysql 中 最常用的类型,其最大特点是变长类型

变长类型

不同于 int 、 bigint 这类存储长度为固定值的类型,int 存储长度固定为 32 bit,bigint 存储长度固定为 64bit,只要在取值范围内,不管你的数值是多少,哪怕是1,也要占用这么多长度

varchar 这类变长类型就不一样了,他们的存储长度是根据内容而变化的,也就是内容需要占用多大存储空间,实际就会占用多大存储空间

最大存储长度和最大能存储的字符数

varchar 这类变长类型 还可以设置最大可以存储的长度或最大能存储字符数,语法为 varchar(x) 。

4.1 版本之前

4.0 版本之前,varchar (x) 中的 x 的单位是byte(字节),例如 varchar (20) 指的是最大存储长度为 20 byte 也就是 20*8=160 bit。

那 20 byte 能存储多少个字符呢,这注意取决于你使用的字符编码。例如你使用的是 utf8mb4 ,它是用4个字节存储一个字符,那么 varchar (20) 最多就只能存储 20/4=5个字符

5.0 版本之后

或许是觉得将 varchar (x) 中的 x 的单位设置为byte(字节) 对用户不友好,比如我想限制简介字段最大不能超过250个字符,我还要根据选择的编码方式去算 x 的值,假设我使用 utf8mb4 ,则 x = 250*4=1000

但实际上,这根本不应该是用户关心的内容,因此 5.0 版本之后,mysql 将varchar (x) 中的 x 的单位设置为字符

从此之后,所见即所得,varchar (20) 就代表最大能存储 20 个字符,跟编码方式无关,不管你选择什么编码,最大都可以存储 20 个字符,更不用算什么最大字节数了

还有一个问题,5.0 版本之后 varchar (x) 中的 x 最大可以设置成多少呢? mysql 并没有直接给出答案,而是给出了一条限制, mysql 规定使用 InnoDB 存储引擎时,为了保证查询效率,一页(InnoDB 存储引擎的最小储存单元是页,一个页的大小默认是 16K)至少要存储两条数据。

也就是说在常用的 InnoDB 存储引擎中,一行数据的最大存储长度不能超过 65535 bit。

假设你的表只有一个 varchar 字段,并且使用 latin1 编码,这种编码使用1个字节来存储一个字符,则 x 的最大值为 65535 吗?答案是no

65535 除了用来存储数据外,还有用来存储列的长度、是否允许为空等元信息,因此不到 65535 。当然这只是表中只有一个字段的情况,如果表中还有其他字段,比如还有一个 int 类型的字段,那还要减去 int 类型的固定长度 32 bit 也就是 4 个字节,同时还要减去存储 int 类型的字段的元信息的长度,这还不算完,假设表中还有其他的变长类型字段如 varchar 、 text 、bolb 哪算起来就更麻烦了

其实没必要去算,根据你的业务,正常去设置 varchar 的长度就行,理由如下

varchar 的最大长度是否越大越好

varchar 这类变长类型,由于存储长度是根据内容来的,即使把字段设置成 varchar(10000),如果存储的内容很短,占用的空间也会很少,因此有人觉得将 varchar 的最大长度设置的越大越好。

实际上并不是这样的,在查询时因为涉及到文件排序或者基于磁盘的临时表时,更长的列会消耗更多的内存,所以在使用时,还是需要根据实际业务,来评估最大长度。

注意:一旦数据长度超过设定的最大值,就会插入失败,需要更改表结构,因此推荐冗余 10% 的长度(因业务而异)来减小出错的概率