## 字符串类型
#### char
定长字符:指定长度之后,系统一定会分配指定的空间用于存储数据.
基本语法:char(L),L代表**字符数**(中文与英文字母一样),L长度为0到255.
#### varchar
变长字符:指定长度之后,系统会根据实际存储的数据来计算长度,分配合适的长度(数据没有超出长度)
基本语法:Varchar(L),L代表字符数,L的长度理论值位0到65535.
1. char一定会使用指定的空间,varchar是根据数据来定空间.
2. char的数据查询效率比varchar高:varchar是需要通过后面的记录数来计算.
3. 如果确定数据一定是占指定长度,那么使用char类型,如果不确定数据到底有多少,那么使用varchar类型,如果数据长度超过255个字符,不论是否固定长度,都会使用text,不再使用char和varchar.
4. 因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生后,系统都会在数据后面增加1-2个**字节**的额外开销:是用来保存数据所占用的空间长度如果数据本身小于127个**字符**:额外开销一个**字节**;如果大于127个,就开销两个**字节**.
#### char和varchar数据存储对比(utf8,一个字符都会占用3个字节,gbk一个字符占用2个字节)
| 存储数据 |char(2) | varchar(2) | char所占字节 |varchar所占字节 |
| --- | --- | --- | --- | --- |
| A | A |A | 2* 3 = 6 | 1 * 3 +1 = 4 |
char因为是定长,所以肯定用了两个字符去存储,而varchar是不定长,只会用一个字符去存储,还有一个字节用来记录长度.
## text
文本类型 : 本质上mysql提供了两种文本类型.
1. text : 存储普通的字符文本.
2. blob : 存储二进制文本(图片,文件) ,一般都不会使用blob来存储文件本身,通常是使用一个链接来指向对应的文件本身,这样就可以节省可多的空间.
### 系统中提供了四种text
1. tinytext : 系统使用一个字节来保存,系统是用1个字节来保存数据所在的位置,并不是真的用1个字节来保存数据,实际能够存储的数据为: 2^8 +1 ;
2. text :使用两个字节来存储,实际存储2^16 +2 .
3. mediumtext : 使用三个字节存储,实际存储为 : 2^ 24 +3 .
4. longtext : 使用四个字节存储 , 实际存储为 :2 ^ 32 +4.
注意 :
1. 在选择对应的存储文本的时候,不用颗粒去选择text类型,系统会自动根据存储的数据长度来选择合适的文本类型.一般使用text类型就行了.
2. 在选择字符存储的时候,如果数据超过255个字符,那么一定要选择text存储(效率更高,而且更节省空间).
3.
#### enum (枚举类型)
枚举类型: 在数据插入之前,先设定几个项,这几个项就是可能最终出现的数据结果.
如果确定某个字段的数据只有那么几个值 :如性别,男,女,保密,系统就可以在设定字段的时候规定当前字段只能存在固定的几个值,那么请使用枚举类型.
系统提供了1到2个字节来存储枚举数据 : 通过计算enum列举的具体值来选择实际的存储空间,如果数据值列表在255以内,name1个字节就够了,如果超过255但是小于65535,那么系统采用两个字节来保存.
语法
~~~
create table class(
gender enum('男','女','保密'));
~~~
注意:
1. 只有插入enum设定的这几个值才能插入成功,否则的话系统会报错.
2. 枚举enum的存储原理:实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标:当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始Enum(1=>‘男’,2=>’女’,3=>’保密’).
3. 特性:在mysql中系统是自动进行类型转换的:如果数据碰到“+、-、*、/”系统就会自动将数据转换成数值:而普通字符串转换成数值为0 .Select 字段名 + 0 from 表名.
4. 既然实际enum字段存储的结果是数值:那么在进行数据插入的时候,就可以使用对应的数值来进行.
~~~
select gender + 0 from 表名;
结果: 系统进行了强制转换.
+------------+
| gender + 0 |
+------------+
| 1 |
| 1 |
+------------+
~~~
枚举类型的意义 :
1. 规范数据本身,限定只能插入规定的数据项.
2. 节省存储空间.
#### set (集合类型)
集合:是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制:1表示该选项被选中,0表示该选项没有被选中。
语法
~~~
create table class(
hobby set('足球','篮球','排球','游泳','乒乓球')
);
~~~
插入数据 : 注意在最外层加上引号,里面每个数据用逗号隔开, 不在set设置的数据无法插入,这个类型类似html中的多选.
~~~
insert into class values("足球,篮球,游泳");
~~~
- 数据库介绍
- 数据库基本概念
- SQL介绍
- MySQL服务端架构
- 库操作
- 表操作
- 字段类型
- 整数类型
- 小数类型
- 字符串类型
- 日期/时间类型
- json类型
- 字段属性
- Null
- 默认值
- 列描述
- 主键
- 自动增长
- 唯一键
- 数据库基础操作
- 增
- 删
- 改
- 查
- 运算符
- 算术运算符
- 比较运算符
- 逻辑运算符
- in运算符
- is运算符
- like运算符
- 高级查询
- 联合查询
- 连接查询
- 交叉连接
- 内连接
- 外连接
- Using关键字
- 子查询
- 标量子查询
- 列子查询
- 行子查询
- 表子查询
- exists子查询
- 子查询特定关键字
- 用户权限管理
- 用户管理
- 权限管理
- 外键
- 外键操作
- 外键基本要求
- 约束
- 视图
- 事务安全
- 自动事务
- 手动事务
- 事务特点
- 变量
- 系统变量
- 会话变量
- 局部变量
- 流程结构
- if分支
- while循环
- 函数
- 内置函数
- 字符串函数
- 时间函数
- 数学函数
- 其他函数
- 存储过程
- 与函数的区别
- 存储过程操作
- 存储过程的形参类型
- 触发器
- 触发器概念
- 触发器操作