MySQL Innodb char,varchar,text,blob区别

VARCHAR

1.存储可变长字符串。比定长类型更节省空间,因为它仅需要必要的空间。
列外:当表使用ROW_FORMAT= FIXED创建的话,每一行都会使用定长存储。浪费空间。
2.VARCHAR使用1-2个额外字节记录字符串的长度:列的最大长度<=255字节,则只使用1个字节表示,否则使用2个字节。假设使用Latin1字符集,VARCHAR(10)需要11个存储空间,VARCHAR(1001)需要1002个存储空间。
3.Update时可能使行变得比原来更长,导致额外工作。如果行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下不同引擎处理方式不一样。MyISAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使得行可以放进页内。
符合使用VARCHAR:
1.字符串的最大长度比平均长度大很多;
2.列的更新很少,碎片不是问题。
3.InnoDB将过长的VARCHAR存储为BLOB

CHAR

CHAR是定长的:MYSQL总是根据定义的字符串长度来分配足够的空间,并且会剔除末尾的空格。
CHAR适合存储很短的字符串,或者所有的字符串都接近于同一个长度。
对于经常改变的数据CHAR也比VARCHAR更好,因为定长CHAR不容易产生碎片。对应非常短的列CHAR比VARCHAR在空间上也更有效率。
二进制数据存储一般使用BINARY和CARBINARY类型。

BLOB和TEXT

BLOB和TEXT都是为存储很大的数据而设计地字符串数据类型,分别采用二级制和字符方式进行存储。对应TINYTEXT,SMALLTEXT这一类家族。
与其他的类型不同,MySQL把每个BLOB和TEXT当作是一个独立的对象处理。存储引擎会做特殊处理。当他们太大的时候,InnoDB会使用专门的“外部”存储区域进行存储,此时每个值在行内需要1-4个字节存储一个指针,然后在外部区域存储实际的值。如下图所示

BLOB和TEXT的页溢出

可以看到前768字节是前缀数据,之后都是偏移量
BLOB和TEXT区别使BLOB存储的是二进制数据,没有排序规则或字符集,而TEXT类型有字符集和排序规则
MySQL将BLOB和TEXT列进行排序和其他类型不同,它只对每个列的前max_sort_length字节而不是整个字符串做排序。如果只需要前面一个小部分字符,则可以减少max_sort_lenght的配置。使用ORDER BY SUSTRING(column, length)
MySQL不能将BLOB和TEXT的全部长度的字符串进行索引,也不能使用这些索引消除排序

其他注意事项

1.官方手册中定义的VARCHAR最大长度65535指的是所有VARCHAR列长的总和,如果列长超过这个长度,依然无法创建

你可能感兴趣的:(MySQL Innodb char,varchar,text,blob区别)