mysql的varchar与text对比

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的varchar与text对比相关的知识,希望对你有一定的参考价值。

varchar和text是mysql字符存储争议比较多的领域,究竟大字段用那个比较好,我们来对比一下,然后自行选择.

大小对比
VARCHAR :varchar在mysql中满足最大行限制,也就是 65535(16k)字节,在mysql中使用 uft-8(mysql中的 utf-8 和我们正常的编码utf-8不同)字符集一个字符占用三个字节,
①使用utf-8字符编码集varchar最大长度是(65535-2)/3=21844个字符(超过255个字符会有2字节的额外占用空间开销,所以减2,如果是255以下,则减1)。
②使用 utf-8mb4 字符集(mysql中 utf-8mb4 字符集也就是我们通常使用的 utf-8 字符集),mysql中使用 utf-8mb4 字符集一个字符占用4个字节,所以 varchar 最大长度是(65535-2)/4=16383 个字符(超过255个字符会有2字节的额外占用空间开销,所以减2,如果是255以下,则减1)。
TEXT :最大限制是64k,
采用 utf-8 字符集,(262144-2)/3=87381 个字符。
采用 utf-8mb4字符集,(262144-2)/4=65535 个字符。
MEDIUMTEXT  :最大长度限制16M  (16M-3)/3 = 5,592,405 个字符
LONGTEXT :最大长度限制4G
----------------------------------------
额外占用空间开销说明:
varchar 小于255byte  1byte overhead
varchar 大于255byte  2byte overhead
tinytext 0-255 1 byte overhead
text 0-65535 byte 2 byte overhead
mediumtext 0-16M  3 byte overhead
longtext 0-4Gb 4byte overhead
从处理形态上来讲varchar 大于768字节后,实质上存储和text差别不是太大了.基本认为是一样的。另外从8000byte这个点说明一下:对于varcahr, text如果行不超过8000byte(大约的数,innodb data page的一半) ,overflow不会存到别的page中。
----------------------------------------
差异点:
text字段,MySQL不允许有默认值。建立索引必须给出前缀索引长度.
varchar允许有默认值,对索引长度没限制,
但InnoDB引擎单一字段索引的默认长度最大为767字节,myisam为1000字节.例如字符编码是utf8,那么varchar的索引最大长度是256个字符.超出限制会导致索引创建不成功,转而需要创建前缀索引.设置innodb_large_prefix=1可以增大限制,允许索引使用动态压缩,但是表的row_format必须是compressed或者dynamic.可以使索引列长度大于767bytes,但是总长度不能大于3072 bytes.
----------------------------------------
总结:
  根据存储的实现: 可以考虑用varchar替代tinytext
  如果需要非空的默认值,就必须使用varchar
  如果存储的数据大于64K,就必须使用到mediumtext , longtext
  varchar(255+)和text在存储机制是一样的
  需要特别注意varchar(255)不只是255byte ,实质上有可能占用的更多。


感谢吴炳锡老师指导

参考文章地址:http://wubx.net/varchar-vs-text/


以上是关于mysql的varchar与text对比的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:大型 VARCHAR 与 TEXT?

mysql中char,varchar与text类型的区别

mysql中char,varchar与text类型的区别和选用

在 MySQL 中声明值大于 255 的 VARCHAR 是不是明智?

mysql中char,varchar与text类型的区别和选用

MySQL20个经典面试题