varchar(N) 最多占用多少空间? 1、N是字节还是字符?

答:是字符 2、不同字符集占用空间是否一样? 答:变长类型空间 = 字段长度+字符实际长度

变长类型:varchar、text、blob等

varchar(N) 字符集 latin1

uft8

占用空间(最大)

N + (1 or 2) bytes

3*N + (1 or 2) bytes

 当varchar(N)可能超过255字节时,字段长度 = 2(会使用2字节的空间来表示长度)

例题: varchar(100)字符集为utf8时,“aaa” 占用几个字节?

答案:5个字节

答案解释:varchar(100)最大长度可能超过255,比如存入100个中文,实际字符长度是300(超过255), 所以就必须使用2个字节空间来表示其长度。所以:

1 2字节空间 + 3个字符实际长度 = 5 utf8是变长的,存英文是1个字节,存中文是3个字节

例题: 【截图】 两个字节的字段长度 + 实际上3 * 100的字节长度 = 302 char和varchar

区别:

char最大255(字符),varchar总最大65535(字节)——如果一个表里既包含char也包含varchar字 段,所有char加上varchar,总的不能超过65535

char会截掉尾部空字符,varchar不会 char固定长度字符,varchar变长——注意:InnoDB不是这样,InnoDB根据行组织格式(row format)来决定如何为char类型分配空间 InnoDB row format:

1、Antelope

redundant 古老废弃

compact 当前默认 2、 Barracuda

dynamic 以后默认,compact变种——推荐使用 compressed 压缩表

除了redundant之外,在处理多字节字符集(该gbk、utf8等)char字段时,InnoDB都会当做变长字符来 处理,单字节的则仍然会分配固定长度空间

就是说: utf8、gbk字符集的char与varchar一致,都是变长的

latinl字符集的char字段还是会分配固定的存储空间 所以!!!!使用InnoDB存储引擎时,对于常用的字符集(gbk、utf8)char和varchar没有区别,可以

统一使用varchar 延伸知识点(无答案):

InnoDB不同的行是如何组织的 各行格式有什么特点

varchar和text varchar和text都可以表示“长字符”,都是变长的,并且都是实际多少字符就是占用多少空间。 所以存储“比较长”的字符串时,是选择varchar还是text呢?

功能方面:

varchar长度有限,一个表里面所有varchar+char字段总和不能超过65535字节 varchar可以有默认值

如何选择:

如果表中有太多长字段,可能无法将所有字段都建为varchar,可以结合varchar和text使用 如果字段需要有默认值,那么使用varchar

性能方面:

text字段时溢出字段,而varchar不会溢出,所以varchar更高效——但作者又说这句话是错误的。因 为text字段不一定是溢出字段,只有当整个行长不能存储在页中,可能会把最长的字段以行链接的 方式链接到别的行、别的页里面去。text、varchar等变长字符类型都是这样的 text字段无法使用tmp_table_size内存排序,直接磁盘排序(using filesort)

性能方面:功能上能满足的话,就推荐varchar 为什么varchar(N)的N尽量小

疑问:既然varchar是非固定长度,存储“aaa”时,varchar(10)与varchar(100)使用空间都相同,为啥要使 用varchar(10)呢

引擎层(磁盘存储与buffer pool)空间使用上两者确实是相同的 Server层处理数据时并非按实际大小分配内存(Server可能处理数据的时候按照你表定义的分配空 间)

一些操作(比如排序、表DDL时),varchar(100)会利用更多的(磁盘及内存)空间,效率会更低

MySQL Server层并不知道引擎层数据时怎么组织的,各引擎组织方式肯定不一样。Server层在分配内存 时使用的是表定义时的长度,一些需要在Server处理数据的操作都可能会受到影响!比如排序、加索引 时使用更多内存(tmp_table_size)或磁盘空间,性能受到影响!

int(N)

给int指定长度有什么意义? int(11)、int(4)整形范围及使用上有区别吗? 区别:当字段定义时加了zerofill时,显示时会有区别,但几乎不用 总结:无论N是多少,没有任何区别,请放心使用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql