MySQL之text字段
之前做的SQL审核工具不支持text类型的字段的,今天一个业务方问我为什么不支持text字段,大概给他讲了讲,后续发现可能还有些不完善的地方,这里总结一下text的用法,先来看看官方文档上对这个字段的解释:
TEXT
类型一般分为 TINYTEXT(255长度)、TEXT(65535)、
MEDIUMTEXT(int最大值16M)
,和LONGTEXT(long最大值4G)这四种,它被用来存储非二进制字符集,二进制字符集使用blob类型的字段来存储。对于text列,插入时MySQL不会对它进行填充,并且select时不会删除任何末尾的字节。
如果text列被作为索引,则在它的内容后面添加空格时,会出现duplicate key错误,也就是说,如果我们定义了一个作为索引的text字段,它的值是'a',则不能定义一个值为'a '的记录,因为这样会产生冲突。
当我们对text列进行排序的时候,决定顺序的字符个数是由参数max_sort_length来决定的,例如下面这个例子:
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM t
-> ORDER BY comment;
在这个例子中,仅对comment字段的前2000个字符进行排序。
text
对象的最大大小由其类型决定,但实际可以在客户端和服务器之间传输的最大值取决于可用内存量和通信缓冲区的大小。您可以通过更改max_allowed_packet这个参数的值来确定消息缓冲区大小 ,但必须同时为服务器和客户端程序执行此操作,否则是无法生效的。
区
text和varchar的区别
在大多数情况下,我们可以把text视为varchar字段,但是这两个字段类型在存储字符大小上有一些区别:
varchar在mysql中必须满足最大行宽度限制,也就是 65535(64k)字节,而varchar本身是按字符串个数来定义的,在mysql中使用uft-8字符集一个字符占用三个字节,所以单表varchar实际占用最大长度如下: 1.使用utf-8字符编码集varchar最大长度是(65535-2)/3=21844个字符(超过255个字节会有2字节的额外占用空间开销,所以减2,如果是255以下,则减1)。 2.使用 utf-8mb4字符集,mysql中使用 utf-8mb4 字符集一个字符占用4个字节,所以 varchar 最大长度是(65535-2)/4=16383 个字符(超过255个字节会有2字节的额外占用空间开销,所以减2,如果是255以下,则减1)。
text的最大限制也是64k个字节,但是本质是溢出存储,innodb默认只会存放前768字节在数据页中,而剩余的数据则会存储在溢出段中。text类型的数据,将被存储在元数据表之外地方,但是varchar/char将和其他列一起存储在表数据文件中,值得注意的是,varchar列在溢出的时候会自动转换为text类型。text数据类型实际上将会大幅度增加数据库表文件尺寸。
除此之外,二者还有以下的区别
1、当text作为索引的时候,必须 制定索引的长度,而当varchar充当索引的时候,可以不用指明。
2、text列不允许拥有默认值
3、当text列的内容很多的时候,text列的内容会保留一个指针在记录中,这个指针指向了磁盘中的一块区域,当对这个表进行select *的时候,会从磁盘中读取text的值,影响查询的性能,而varchar不会存在这个问题。
今天的内容就这么多吧。