当别人问我 varchar 和 text 有什么区别时,
我下意识想到的就是在需要储存很多数据的时候(比如新闻稿的正文),就用 text 类型,但它们到底有什么区别,答不上来
故此次去了解了一下 VARCHAR 和 TEXT,做到什么时候能用,该怎么用!
根据从 MySQL 官方文档了解到的,总结如下:
MySQL: V5.7
Charset: UTF8
VARCHAR(M)
The range of M is 0 to 65,535 bytes, a maximum of 21,844 characters
VARCHAR 最多支持 65535 字节,字符数就是 21844 个,这里面包含 汉字
TEXT 实际上有四种类型,此处仅探讨 TEXT 类型
TINYTEXT : with a maximum length of 255 (28 − 1) characters
TEXT: with a maximum length of 65,535 (216 − 1) characters
MEDIUMTEXT: with a maximum length of 16,777,215 (224 − 1) characters
LONGTEXT: with a maximum length of 4,294,967,295 or 4GB (232 − 1) characters
TEXT 支持的最大字符数是 65,535,但是需要注意这段话
The effective maximum length is less if the value contains multibyte characters.
我之前印象中的 TEXT 其实是 LONGTEXT(可存 4GB)
区别
#1 长度限制不同
要储存数据超出最大长度限制都会报错
VARCHAR(M) 设置的长度(M)就是字符数,并且最大字符数为 21844
TEXT 支持的最大字符数为 65,535,但如果text字段里储存的值包含多字节字符(1汉字占3字节),则会让最大字符数小于 65,535,全部都是英文则没这个问题
#2 查询性能
TEXT 列在返回数据的时候,该字段的数据会通过临时表来处理,会有性能损耗,MYSQL 建议 如果不使用这个字段,就不要返回,避免使用 SELECT * 做查询
#3 索引
TEXT列上的索引,必须指定索引前缀长度
VARCHAR,前缀长度是可选的
#4 默认值
TEXT columns cannot have DEFAULT values
#5 排序
Only the first max_sort_length
bytes of the column are used when sorting. The default value of max_sort_length
is 1024
默认的话,也就是前1024字节的数据会用来排序,这个我未验证
参考
https://dev.mysql.com/doc/refman/5.7/en/string-type-syntax.html
https://dev.mysql.com/doc/refman/5.7/en/blob.html