mysql 5.7中 char和varchar字符类型对比及详细介绍

mysql char和varchar的区别:mysql5.7中char和varchar字符类型对比及详细介绍(1)

在mysql中字符串常用的是定长 char和变长 varchar,我们以mysql5.7为背景详解讲解这两种类型的使用

char

最大长度是255 这个要注意,最大长度,定长在MySQL中限制长度在255个字符内

varchar

长度范围65535,注意这个是理论值,实际是比这个少的,因为字符存储也要占有一定字 节,比如在字符开头会使用1到2个字节记录字符串长度,字符超过255后需要2个字节来记录长度

65535:

这里的长度65535是字节数(mysq5.7中你可以认为是字符长度数), 在msyql中数据存储最小单位是page,每个page大小为8k(当然mysql5.7默认page是16K),8k是主流数据库中默认页的大小(oracle 、sql server 等都是8k),表的一行数据(常规行)是不能大于页的大小,因此一行数据最大是8k,那么65535这个是字节,我们进行计算 8字节为B,1024个B为K,正好是8K,所有varchar字段的最大长度小于65535,也就是说一行数据加起来要小于65535,或者说一条记录必须在一个页中,是不能跨页的。

char 和 varchar存储区别:

char定长字段

我们定义了 char(20),那么我们我们存什么值,在存储层都是占用20个长度的,一般数据库都是 在右侧进行补足长度,当然这造成了硬盘存储存储的浪费

varchar 变长字段

我们定义了varchar(20),我们存啥值,就是啥值,不会进行长度补足,在存储方面比较节省空间

内存差异

char(20) 和 varchar(20),虽然硬盘存储上varchar有一定的优点,但是从page读取到内存之后,两者在内存中占用的大小是一样多的,并不以varchar事件存储的大小为准,这是为什么呢?其实我们想想,我们需要对varchar字段进行更新,从长度2更新为长度10,那么如果按该字段实际大小分配内存在更新后就会导致内存混乱,所以所有字段进内存时不管该字段类型是变长还是定长数据库都会以定长最大长度方式进入内存

使用建议

针对需要频繁改动的字段建议使用char类型,针对基本不会变化的字符使用varchar类型以节省存储空间,如果需要创建索引那么也建议使用char类型,因为char类型能有效避免因字段变化而产生的索引碎片,提高索引性能

varchar的实际长度

varchar(20) 这个20 是代表能存储多少个字符长度,注意是长度,所以这长度是根据各个字符集不同而会不同,我们来看下常见的字符集 utf8 和 utf8mb4 各能存储多长字段

utf8

create table a (a varchar(65535)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;

Code: 1074. Column length too big for column 'a' (max = 21845); use BLOB or TEXT instead 0.000 sec

utf8mb4

create table a (a varchar(65535)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ;

Error Code: 1074. Column length too big for column 'a' (max = 16383); use BLOB or TEXT instead 0.000 sec

utf8最大字符是3个字节,而utf8mb4 是4个字节,所以 使用65535 分别除 3 和4 结果就是 21845 和 16383

字符类型长度修改建议

字符的长度随着业务需求有所变化,需要变长或变短,因此在设计表时候要充分考虑字段长度的后续包容性,确保后期不会因为长度而满足不了业务需求,而贸然去修改字符长度(变短情况可忽略),mysql中并没有像sqlserver 中的修改表元数据的优化(sql server有些字符长度变化是不会导致表重构,只是修改表的元数据定义而已,如 varchar(10)修改为varchar(20) 并不会导致表重构),大多数alter table语句都会导致mysql表进行重构操作,哪怕仅仅是修改下字符长度,当然后续版本可能有所改进,目前而言 除非我们非常确定某个alter语句不会导致表重构,否则不要贸然在生产环境进行数据结构变化。所以针对小表可在服务器不忙时间直接修改,而针对大表则建议 1.生成目标表2.导入数据3.重命名 的步骤来进行

,