MySQL学习(十七):数据类型之文本字符串类型

文本字符串类型

类型值的长度长度范围占用的存储空间
CHAR(M)M0<=M<=255M个字节
VARCHAR(M)M0<=M<=65535实际长度+1个字节
TINYTEXTL0<=L<=255L+2个字节
TEXTL0<=L<=65535L+2个字节
MEDIUMTEXTL0<=L<=16777215L+3个字节
LONGTEXTL0<=L<=4294967295L+4个字节
ENUML0<=L<=655351或2个字节
SETL0<=L<=641,2,3,4或8个字节

1、CHAR与VARCHAR类型

CHARVARCHAR类型都可以存储比较短的字符串。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种类型,分别为TINYTEXTTEXTMEDIUMTEXT
    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<=81个字节
9<=L<=162个字节
17<=L<=243个字节
25<=L<=324个字节
33<=L<=648个字节

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');
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

激洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值