在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。
它们的存储方式和数据的检索方式也都不一样。
数据的检索效率是:char > varchar > text
char:
- 长度范围0~255个字节
- 定长字符串
- 可以有默认值
- 数据长度不足指定长度时,自动用空格填充。
- 数据尾部空格。保存时会忽略,与查询条件对比时会忽略,读取时会忽略。本质是因为数据长度不足指定长度时,自动用空格填充。自动填充的空格不被认为是数据本身。
- 存储或检索过程中不进行大小写转换
varchar:
- 长度范围,5.0.3版本以下0~255个字节,5.0.3版本以上0~65535个字节。
- 变长字符串
- 可以有默认值
- 数据长度不足指定长度时,不会用空格填充。
- 数据尾部空格。保存时会保存,与查询条件对比时会忽略,读取时不会忽略。
- 而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。
- 另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。
- 存储或检索过程中不进行大小写转换
text:
- 长度范围0~65535个字节。
- 长文本数据,varchar的加长增强版,可变长。
- 没有默认值。
- 存储或检索过程中不进行大小写转换
- 后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。
- 给blob或text创建index的时候,必须指定索引长度。
关于存储空间:
在使用UTF8字符集的时候,MySQL手册上是这样描述的:
基本拉丁字母、数字和标点符号使用一个字节;
大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;
韩语、中文和日本象形文字使用三个字节序列。
结论:
1、经常变化的字段用varchar;
2、知道固定长度的用char;
3、超过255字节的只能用varchar或者text;
4、能用varchar的地方不用text;
5、能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;
6、同一张表出现多个大字段,能合并时尽量合并,不能合并时考虑分表
7、对于MyISAM表,推荐char类型;对于InnoDB表,推荐使用varchar类型。