网站后台不显示,可以做网站二维码吗,小程序开发教程免费,评价模板前几天在设计表结构时#xff0c;针对表中的一个字段使用text还是使用varchar是受到了开发同学的挑战。本篇文章对text和varchar的区别做个总结。
VHARCHAR和TEXT对比
char(n)varchar(n)中括号中n代表字符的个数#xff0c;并不代表字节个数#xff0c;所以当使用了中文的…
前几天在设计表结构时针对表中的一个字段使用text还是使用varchar是受到了开发同学的挑战。本篇文章对text和varchar的区别做个总结。
VHARCHAR和TEXT对比
char(n)varchar(n)中括号中n代表字符的个数并不代表字节个数所以当使用了中文的时候(utf8)意味着可以插入m个中文但是实际会占用m*3个字节。同时char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间而varchar只会占用实际字符应该占用的空间1并且实际空间1n。超过char和varchar的n设置后字符串会被截断。char的上限为255字节varchar的上限65535字节text的上限为65535。char在存储的时候会截断尾部的空格varchar和text不会。varchar会使用1-3个字节来存储长度text不会。
下图可以非常明显的看到结果
ValueCHAR(4)Storage RequiredVARCHAR(4)Storage Required‘’’ ’4 bytes‘’1 byte‘ab’ab ’4 bytes‘ab’3 bytes‘abcd’‘abcd’4 bytes‘abcd’5 bytes‘abcdefgh’‘abcd’4 bytes‘abcd’5 bytes
总体来说
char存定长速度快存在空间浪费的可能会处理尾部空格上限255。varchar存变长速度慢不存在空间浪费不处理尾部空格上限65535但是有存储长度实际65532最大可用。text存变长大数据速度慢不存在空间浪费不处理尾部空格上限65535会用额外空间存放数据长度顾可以全部使用65535。
场景问题
从空间方面
varchar
varchar在mysql中满足最大行限制也就是65535(16k)字节在mysql中使用utf8mysql中的utf8和我们正常的编码utf8不同字符集一个字符占用三个字节。
使用utf8字符编码集varchar最大长度是(65535-2)/321844个字符超过255个字符会有2字节的额外占用空间开销所以减2如果是255以下则减1mysql中使用utf8字符集一个字符占用3个字节。使用utf8mb4字符集varchar最大长度是(65535-2)/416383 个字符(超过255个字符会有2字节的额外占用空间开销所以减2如果是255以下则减1mysql中utf8mb4字符集也就是我们通常使用的utf8mb4字符集)mysql中使用utf8mb4字符集一个字符占用4个字节。
text
最大限制是64k采用utf8字符集占用(262144-2)/387381个字符采用utf8mb4字符集占用(262144-2)/465535个字符。除此之外基于 blob二进制大对象类型的变体还有如下三个
text 的最大长度为 65,535 字节与 varchar 相同。mediumtext 的最大长度约为 16 兆字节。longtext 的最大长度约为 4 gb。
另外从官方文档中可以得知当varchar大于某些数值的时候其会自动转换为text大概规则如下
大于varchar255变为 tinytext大于varchar500变为 text大于varchar20000变为 mediumtext
所以对于过大的内容使用varchar和text没有太多区别。
关于性能方面
索引会是影响性能的最关键因素而对于text来说只能添加前缀索引并且前缀索引最大只能达到1000字节。而貌似varhcar可以添加全部索引但是经过测试其实也不是。由于会进行内部的转换所以long varchar其实也只能添加1000字节的索引如果超长了会自动截断。如下代码
localhost.testcreate table test (a varchar(1500));
Query OK, 0 rows affected (0.01 sec)localhost.testalter table test add index idx_a(a);
Query OK, 0 rows affected, 2 warnings (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 2localhost.testshow warnings;
------------------------------------------------------------------------
| Level | Code | Message |
------------------------------------------------------------------------
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
------------------------------------------------------------------------从上面可以明显单看到索引被截断了而这个767是由于innodb自身的问题使用innodb_large_prefix设置。
总结
使用varchar可以选择大小并为存储设置上限使用text则不能设置上限固定长度6553516k。使用varchar可以设置默认值text不可以设置默认值。使用varchar可以进行排序查询text不可以排序查询。使用varchar超过255长度都会隐式的转为text处理。涉及text列的查询可能会导致在磁盘而不是内存中创建临时表。使用基于磁盘的表会显着降低性能这意味着使用 text 的查询可能会慢得多。使用text字段时需要将text字段单独放到一个表中。
完