varchar,char,text的区别

如题所述

第1个回答  2022-06-30
1. 区别一:定长和变长

char表示定长,长度固定;varchar是变长,即长度可变。

char如果插入的长度小于定义的长度时,则用空格填充;

varchar小于定义长度时,还是按实际长度存储,插入多长就存多长,但要在总长度上加1字符,这个用来存储位置。如果数据存在空格,当值保存和检索时,空格会保留。

建议!

1. myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。

2. memory存储引擎 目前都使用固定数据行存储,因此无论使用char varchar列都没关系,

3. innodb 存储引擎 建意使用varchar 类型

因为长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储和查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar刚好相反,以时间换空间

2. 区别二:存储的容量不同

对char来说,最多能存放的字符个数255,和编码无关

而varchar,最多能存放65532个字符。varchar的最大有效长度由最大行大小和使用字符集确定。整体最大长度是65532

在MySQL中,char, varchar, text类型的字段都可以用来存储字符类型的数据,char和varchar都可以指定最大的字符长度,但text不可以

数据的检索效率是:char > varchar > text

具体说明:

char: 存储定长数据很方便,char字段上的索引效率更高,必须在括号里定义长度,可以有默认值,比如定义char(10), 那么不论存储的数据是否达到10个字节,都要占去10个字节的空间(自动用空格填充),char在存储的时候会将右侧空格进行剔除,保留左侧空格。

varchar: 存储变长数据,但存储效率没有char高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。

varchar和char在查询的时候都只会根据where条件中的左侧空格进行判断,右侧末尾的空格会忽略

text: 存储可变长度的非unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储和检索过程中,不存在大小写转换,后面如果指定长度,不会报错,但这个长度是不起作用的,在插入数据时,超过你指定长度还是可以正常插入的。

关于存储空间:

在使用UTF8字符集的时候,MySQL手册上是这样描述的:

1. 基本拉丁字母、数字和标点符号使用一个字节;

2. 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;

3. 韩语、中文和日本象形文字使用三个字节序列。

结论:

1、经常变化的字段用varchar;

2、知道固定长度的用char;

3、超过255字节的只能用varchar或者text;

4、能用varchar的地方不用text;

5、能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;

6、同一张表出现多个大字段,能合并时尽量合并,不能合并时考虑分表

//资料来源于网络 脚本之家