文本字符串类型
类型 | 值的长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|
CHAR(M) | M | 0<=M<=255 | M个字节 |
VARCHAR(M) | M | 0<=M<=65535 | 实际长度+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 | 0<=L<=65535 | 1或2个字节 |
SET | L | 0<=L<=64 | 1,2,3,4或8个字节 |
1、CHAR与VARCHAR类型
CHAR
和VARCHAR
类型都可以存储比较短的字符串。CHAR固定长度
,VARCHAR可变长度
。
-
CHAR:
CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。
如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充
空格以达到指定的长度。当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。
定义CHAR类型字段时,声明的字段长度即为CHAR类型字段所占的存储空间的字节数。 -
VARCHAR:
VARCHAR(M) 定义时,必须指定
长度M,否则报错。
MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;MySQL5.0版本以上,varchar(20):指的是20字符。
检索VARCHAR类型的字段数据时,会保留数据尾部的空格。VARCHAR类型的字段所占用的存储空间为字符串实际长度加1个字节。
2、TEXT类型
- 在MySQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为
TINYTEXT
、TEXT
、MEDIUMTEXT
和
LONGTEXT
类型。 - 在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和VARCHAR类型相同。
- 由于实际存储的长度不确定,
MySQL 不允许 TEXT 类型的字段做主键
。遇到这种情况,你只能采用CHAR(M),或者 VARCHAR(M)。
TEXT文本类型,可以存比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来代替。还有TEXT类型不用加默认值,加了也没用。而且text和blob类型的数据删除后容易导致“空洞”,使得文件碎片比较多,所以频繁使用的表不建议包含TEXT类型字段,建议单独分出去,单独用一个表。
3、ENUM类型
-
ENUM
类型也叫作枚举
类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值
。 -
其所需要的存储空间由定义ENUM类型时指定的成员个数决定。
当ENUM类型包含1~255个成员时,需要1个字节的存储空间;
当ENUM类型包含256~65535个成员时,需要2个字节的存储空间。
举例:
#创建表如下:
CREATE TABLE test_enum(
season ENUM('春','夏','秋','冬','unknow')
);
#添加数据:
INSERT INTO test_enum
VALUES('春'),('秋');
# 忽略大小写
INSERT INTO test_enum
VALUES('UNKNOW');
# 允许按照角标的方式获取指定索引位置的枚举值
INSERT INTO test_enum
VALUES('1'),(3);
# 当ENUM类型的字段没有声明为NOT NULL时,插入NULL也是有效的
INSERT INTO test_enum
VALUES(NULL);
#报错:Data truncated for column 'season' at row 1
INSERT INTO test_enum
VALUES('ab');
4、SET类型
SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64
。设置字段值时,可以取取值范围内的0个或多个值
。
当SET类型包含的成员个数不同时,其所占用的存储空间也是不同的,体如下:
成员个数范围 | 占用的存储空间 |
---|---|
1<=L<=8 | 1个字节 |
9<=L<=16 | 2个字节 |
17<=L<=24 | 3个字节 |
25<=L<=32 | 4个字节 |
33<=L<=64 | 8个字节 |
SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。
举例:
#创建表如下:
CREATE TABLE test_set(
s SET ('A', 'B', 'C')
);
#添加数据:
INSERT INTO test_set (s) VALUES ('A'), ('A,B');
#插入重复的SET类型成员时,MySQL会自动删除重复的成员
INSERT INTO test_set (s) VALUES ('A,B,C,A');
#向SET类型的字段插入SET成员中不存在的值时,MySQL会抛出错误。
INSERT INTO test_set (s) VALUES ('A,B,C,D');