字符串类型
char
定长字符:指定长度之后,系统一定会分配指定的空间去存储数据
基本语法:
char(L)
:L代表字符数(英文与中文一样,这里是字符数)L长度为0到255
varchar
变长字符:指定长度后,系统会根据实际存储的数据来计算长度,分配合适的长度(数据没有超出设置的长度的前提下)。
基本语法:
varcher(L)
:L代表字符数,L的长度理论值为0到65535
因为varcher
要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar
数据产生后,系统都会在数据后面增加1-2两个字节的额外开销:是用来保存数据所占用的空间长度。如果数据本身小于127个字符那么额外开销一个字节;如果数据本身超过127个字符那么久开销两个字节。
char
和varchar
数据存储对比(utf8,一个字符占3个字节)
存储数据 | char(2) | varchar(2) | char所占字节 | varchar所占字节 |
---|---|---|---|---|
A | A | A | 2 * 3= 6 | 1 * 3 + 1= 4 |
AB | AB | AB | 2 * 3= 6 | 2 * 3 + 1= 7 |
char
和varchar
的区别:
char
一定会使用指定的空间,但是varchar
是根据数据来定空间char
的数据查询效率比varchar
高:因为char
的长度一定,就在这么个空间去查就行,varchar
是需要通过后面的记录数来计算
实际使用场景
如果数据定长,那么使用char
类型
如果数据不定长,那么使用varchar
类型
如果数据长度超过255个字符,那么无论是否是定长都会使用text
而不是用char
和varchar
text
文本类型:MySQL
提供了两种文本类型
text
:存储普通的文本类型
blob
:存储二进制文本(图片,文件),一般不使用blob
来存储文件本身,通常是使用一个链接来指向文件本身(节省空间)。
text
系统提供了四种text
tinytext
:系统使用一个字节来保存,实际能够存储的数据为:2^8+1text
:使用两个字节来保存,实际能够存储的数据为:2^16+2mediumtext
:使用三个字节保存,实际存储为:2^24+3longtext
:使用四个字节来保存,实际存储为:2^32+4
注意:
- 在选择对应的存储文本的时候,不用刻意去选择
text
的类型,系统会自动根据存储的数据长度来选择合适的文本类型。 - 在选择字符存储的时候,如果数据超过255个字符,那么一定要选择
text
存储。
enum
枚举类型:在数据插入之前,先设定几个项,这几个项就是可能出现最终出现的数据结果。
如果确定某个字段的数据只有那么几个值:比如性别,男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值:使用枚举。
基本语法:
enum(数据值1,数据值2,...)
系统提供了1到2个字节来存储枚举数据:通过计算
enum
列举的具体值来选择实际的存储空间:如果数据值列表255个以内,那么一个字节就够,如果超过255但是小于65525,那么系统采用两个字节保存。
测试案例
-
创建表
create table my_enum( gender enum('男','女','保密') )charset=utf8;
-
插入数据(合法数据)
insert into my_enum values('男'); insert into my_enum values('女'); insert into my_enum values('男');
-
插入错误数据
enum
有规范数据的功能,能够保证插入的数据必须时设定的范围,其他类型都不可以。insert into my_enum values('male');
-
枚举
enum
存储原理实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标:当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始。
特性:
在
MySQL
中系统是自动进行类型转换的:如果遇到+``-``*``/
,系统就会自动将数据转换成数值,而普通字符串转换成0.select gender+0 from my_enum;
-
既然实际
enum
字段存储是数值:那么在进行数据插入的时候,就可以使用对应的数值来进行insert into my_enum values(3);
枚举的意义
- 规范数据本身,限定只能插入规定的数据项
- 节省存储空间
set
集合:是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制:1表示该选项被选中,0表示该选项没有被选中
基本语法:
set('值1','值2','值3',...)
系统为
set
提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元1个字节:
set
只能有8个选项2个字节:
set
只能有16个选项3个字节:
set
只能有24个选项8个字节:
set
只能有64个选项
set
和enum
一样,最终存储到数据字段中的依然是数字而不是真实的字符串
测试案例
-
创建表
create table my_set( hobby set('篮球','足球','羽毛球','乒乓球','网球','橄榄球','冰球','高俅') )charset=utf8;
-
插入数据
可以插入多个数据,就是在数据插入的字符串中,使用对应的逗号
,
将选项进行隔开insert into my_set values('篮球,乒乓球,冰球');
-
数据选项所在的顺序与数据插入的顺序无关:最终都会变成选项对应的顺序
insert into my_set values('高俅,足球,篮球,乒乓球,冰球');
-
分析数据存储的方式
- 系统将对应的数据选项(设计)按照顺序进行编排,从第一个开始占位,每一个都对应一个二进制位。
- 数据在存储的时候,如果被选中,那么对应的位的值就为1,否则为0
- 系统在进行存储的时候,会自动将得到的最终的二进制颠倒过来,然后在进行转换成十进制存储
-
查看数据
select hobby+0 from my_set;
-
既然是数值,那么就可以插入数值代替实际插入数据
insert into my_set values(255);
数字插入的前提是对应的二进制位上都有对应的数据项。
集合的意义:
- 规范数据
- 节省存储空间