持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
前言
上篇我们学习了MySQL中的数据类型中的日期与时间类型。有兴趣的小伙伴可以阅读(# MySQL学习-数据类型-日期与时间类型)。
下面学习MySQL中的数据类型中的文本字符串类型。
文本字符串类型
MySQL中,文本字符串类型分为CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET等类型。
| 文本字符串类型 | 值的长度 | 长度范围 | 占用的存储空间 |
|---|---|---|---|
| CHAR(M) | M | 0<=M<=255 | M个字节 |
| VARCHAR(M) | M | 0<=M<=65535 | M+1个字节 |
| TINYTEXT | L | 0<=L<=255 | L+2个字节 |
| TEXT | L | 0<=L<=65535 | L+2个字节 |
| MEDIUMTEXT | L | 0<=L<=16777215 | L+3个字节 |
| LONGTEXT | L | 0<=L<=4294967295 | L+4个字节 |
| ENUM | L | 1<=L<=65535 | 1或2个字节 |
| SET | L | 0<=L<=64 | 1,2,3,4或8个字节 |
CHAR和VARCHAR类型
CHAR和VARCHAR类型都可以存储比较短的字符串。
-
CHAR(M)类型一般需要预先定义字符串长度。如果不指定M,则表示长度默认是1个字节。
-
如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
-
定义CHAR类型时,声明的字段长度即为CHAR类型字段所占的空间字节数。
-
VARCHAR(M)定义时,必须指定长度M,否则报错。
-
MySQL4.0版本以下,VARCHAR(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)。MySQL5.0版本以上,VARCHAR(20):指的是20字符。
-
检索VARCHAR类型的字段时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
CHAR和VARCHAR实际使用怎么选择
| 类型 | 特点 | 空间上 | 时间上 | 使用场景 |
|---|---|---|---|---|
| CHAR(M) | 固定长度 | 浪费存储空间 | 效率高 | 存储不大,速度要求高 |
| VARCHAR(M) | 可变长度 | 节省存储空间 | 效率低 | 非CHAR的情况 |
- 存储很短的信息,比如号码101等很短的信息应该用CHAR,因为VARCHAR还要占个byte用于存储信息长度,本来打算节约存储的,结果得不偿失。
- 固定长度的。比如uuid作为主键,那用CHAR应该更合适。因为它固定长度,VARCHAR动态根据长度的特性就消失了,而且还要占个长度信息。
- 十分频繁的改变column。因为VARCHAR每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于CHAR来说是不需要的。
- 具体存储引擎的情况:
- MyISAM数据引擎和数据列:MyISAM数据表,最好使用固定长度CHAR的数据列代替可变长度VARCHAR的数据列。这样使得整个表静态话,从而使数据检索更快,用空间换时间。
- MEMORY存储引擎和数据列:MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系,两者都是使用CHAR类型处理的。
- InnoDB存储引擎,建议使用VARCHAR类型。因为对于InnoDB数据表,内存的行存储格式并没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),而且主要影响性能的因素是数据行使用的存储总量,由于CHAR平均占用的空间多余VARCHAR,所以除了简短并且固定长度的,其他考虑VARCHAR。这样节省空间,对磁盘I/O和数据存储总量比较好。
TEXT类型
在MySQL中,TEXT用来保存文本类型的字符串,共包含4中类型,TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT类型。
由于实际存储的长度不确定,MySQL不允许TEXT类型的字段做主键。遇到这种情况,只能采用CHAR(M)或VARCHAR(M)类型。
总结:
实际开发中,TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。还有TEXT类型不用加默认值,加了也没用。而且TEXT和BLOB类型的数据删除后,容易导致“空洞”,使得文件碎片比较多,所有频繁使用的表不建议包含TEXT类型的字段,建议单独分出去,单独用一个表。
今天先学到这里,明天继续。