Mysql中char、varchar和text类型的区别总结
转载:https://blog.csdn.net/kl_Dreaming/article/details/109465964#:~:text=char和var,空间%2B1<%3Dn。
一、基本概念
1、基础定义
char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。
char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。
超过char和varchar的n设置后,字符串会被截断。
char在存储的时候会截断尾部的空格,varchar和text不会。
varchar会使用1-3个字节来存储长度,text不会。
2、存储空间
char,存定长,速度快,存在空间浪费的可能,会处理尾部空格,上限为255字节。(UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节)
varchar,存变长,速度慢,不存在空间浪费,不处理尾部空格,上限为65535字节,但是有存储长度实际65532字节最大可用。255字节以下用1字节存储长度,255字节以上用2字节存储长度。
text,存变长大数据,速度慢,不存在空间浪费,不处理尾部空格,上限65535字节,会用额外空间存放数据长度,顾可以全部使用65535字节。
官方文档地址,http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/storage-requirements.com.coder114.cn.html#data-types-storage-reqs-strings
3、utf8字符每个字符最多可能需要三个字节,因此 varchar 使用该utf8字符集的 列 可以声明为最多21,844个字符。
官方文档地址,http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/char.com.coder114.cn.html
二、场景问题
1、当varchar(n)后面的n非常大的时候我们是使用varchar好,还是text好?
从存储上看,当varchar大于某些数值的时候,其会自动转换为text,大概规则如下:
大于varchar(255)变为 tinytext
大于varchar(500)变为 text
大于varchar(20000)变为 mediumtext
所以对于过大的内容使用varchar和text没有太多区别。
性能,索引会是影响性能的最关键因素,而对于text来说,只能添加前缀索引,并且前缀索引最大只能达到1000字节。由于会进行内部的转换,所以long varchar其实也只能添加1000字节的索引,如果超长了会自动截断。从索引上看其实long varchar和text也没有太多区别。
总结,当超过255的长度之后,使用varchar和text没有本质区别,只需要考虑一下两个类型的特性即可(主要考虑text没有默认值的问题),但是个人推荐使用varchar(10000),毕竟这个还有截断,可以保证字段的最大值可控。