最近在设计MySQL数据库表时,用到了char和varchar类型,另外还接触到了text类型。他们的存储方式和数据的
检索方式都不一样,今天就对三者之间的异同进行一下总结。
首先要明确的三点:
1.char长度固定,varchar和text长度可变。
2.char和varchar可以设定默认值,text没有默认值。
3.char和varchar定义时要指定长度,text定义时通常不用指定长度,可以自己计算。
接下来分别看一下三个类型的存储和检索特点
char
最大长度255个字符,表现形式Char(M),M表示严格限定的字符数。 注意:是字符数,跟字符集的设定没有关系。
在保存字符串的时候,如果字符串长度不够,则后面用空格补足空字符串会造成空间浪费。
在检索的时候后面的空格会去掉,所以检索出来的数据需要再用trim之类的函数去处理。
varchar
最大长度65535个字节,表现形式Varchar(M),M表示允许的最大字符串长度。注意:是字节数,跟字符集有关。
注意:这里的65535在实际应用中限制的不再是某一列而是一个行定义的长度,要考虑到其它的column。
在保存字符串的时候,不进行填充,节省空间。当值保存和检索时尾部的空格仍保留。
高频率面试题:varchar类型长度范围65535,实际范围为65532或65533。为什么?
varchar存储字符串的同时会在内容开头用1到2个字节保存该字符串的实际长度(小于255采用一个字节保存,长
度超过255时需要2个字节),还有如果存在not null的时候,整条记录需要一个额外的字节来保存当前字段的null
值,也会占用一位。除非所有的字段都不是null,这个字节才可以省略。因此varchar定义的最大长度为65535,实际
长度为65532或65533.
第一段提到,varchar最大长度是65535字节,因此对不同的字符集,有效长度还不一样。
字符类型若为gbk, 每个字符最多占2个字节,最大长度不能超过32767;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
text
text和varchar基本相同,但是text会忽略指定的大小这和varchar有所不同。后面如果指定长度,不会报错误,
但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。存储或检索过程
中,不存在大小写转换.text的65535字节全部用来存储数据,使用额外的2个字节来存储数据的大小,varchar根据存
储数据的大小选择用几个字节来存储。
检索效率
char是直接检索,varchar类型需要检索统计字符串的长度然后进行读取相应的位数就停止了,因此是可变长度的,
存储空间控制的好,但是也因此效率低于char类型。text效率就更低了,需要自己计算长度然后进行检索。
数据的检索效率是:char>varchar>text
适用范围
1. 经常变化的字段用varchar,例如昵称、描述信息等等。
2. 知道固定长度的用char,例如身份证号,手机号
3. 尽量用varchar,能用varchar的地方不用text
4. 超过255字节的只能用varchar或者text,超过varchar范围的会自动强制转换为text类型
关键字:mysql char varchar text 65535 65532 检索 存储