提交 edeb48dd 编写于 作者: 彭世瑜's avatar 彭世瑜

fix

上级 3f46ca27
......@@ -21,3 +21,7 @@
[数据类型-时间日期类型](blog/php-mysql/sql-datetime.md)
[数据类型-字符串类型](blog/php-mysql/sql-string.md)
[数据类型-enum 枚举类型](blog/php-mysql/sql-enum.md)
[数据类型-Set集合](blog/php-mysql/sql-set.md)
# enum 枚举类型
例如:
```
性别 gender 男 女 保密
```
基本语法
```
enum(数据值 1,数据值 2...);
```
- 数据值列表在 255 个以内,使用 1 个字节来存储
- 数据值列表超过 255,但是小于 65535,使用 2 个字节来存储
```sql
-- Enum(0=>'男', 1=>'女', 2=>'保密')
create table my_enum(
gender enum('男', '女', '保密')
)
mysql> desc my_enum;
+--------+----------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------------+------+-----+---------+-------+
| gender | enum('男','女','保密') | YES | | NULL | |
+--------+----------------------------+------+-----+---------+-------+
-- 插入规范数据
insert into my_enum (gender) values ('男');
insert into my_enum (gender) values ('女');
mysql> select * from my_enum;
+--------+
| gender |
+--------+
| |
| |
+--------+
```
枚举可以规范数据
枚举类型存储的不是真正的字符串,而是存储了下标
```sql
-- MySQL 会自动类型转换,+、-、\*、/ 会将数据转换成数值,普通字符串转换为数值 0
select gender + 0 from my_enum;
mysql> select gender + 0 from my_enum;
+------------+
| gender + 0 |
+------------+
| 1 |
| 2 |
+------------+
-- 可以直接插入数值数据
insert into my_enum (gender) values (1);
mysql> select * from my_enum;
+--------+
| gender |
+--------+
| |
| |
| |
+--------+
```
枚举的意义
- 规范数据本身,限定只能插入规定的数据项
- 节省存储空间
# Set集合
多个数据选项可以同时保存,本质按照对应的二进制位来控制
- 1表示选中
- 0表示没有选中
语法
```
set('值1', '值2'...)
```
```
1个字节,set只能有8个选项
2个字节,set只能有16个选项
3个字节,set只能有24个选项
8个字节,set只能有64个选项
```
set和enum一样,最终存储到数据字段中的依然是数字而不是真实的字符串
```sql
create table my_set(
hobby set('篮球', '足球', '羽毛球', '乒乓球')
);
mysql> desc my_set;
+-------+------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------------------------------+------+-----+---------+-------+
| hobby | set('篮球','足球','羽毛球','乒乓球') | YES | | NULL | |
+-------+------------------------------------------------+------+-----+---------+-------+
-- 多个选项逗号隔开
insert into my_set (hobby) values ('篮球,足球,乒乓球');
mysql> select * from my_set;
+-------------------------+
| hobby |
+-------------------------+
| 篮球,足球,乒乓球 |
+-------------------------+
-- 数据选项与插入的顺序无关,最终会变成选项对应的顺序
insert into my_set (hobby) values ('足球,篮球');
mysql> select * from my_set;
+-------------------------+
| hobby |
+-------------------------+
| 篮球,足球,乒乓球 |
| 篮球,足球 |
+-------------------------+
```
## 数据存储的方式
系统将对应的数据选项按照顺序进行编排,从第一个开始进行占位,每一个都对应一个二进制位
数据存储的时候,如果被选中,那么对应的为的值就变为1,否则为0
系统在存储的时候,会自动将的得到的二进制反转,然后转换成十进制存储
```
set('篮球','足球','羽毛球','乒乓球')
1 1 1 1
('篮球,足球,乒乓球')
1 1 0 1
反转: 1 0 1 1 =》 1 + 2 + 8 = 11
('足球,篮球')
1 1 0 0
反转: 0 0 1 1 =》 1 + 2 = 3
```
```sql
-- 以数值方式查看数字
mysql> select hobby + 0 from my_set;
+-----------+
| hobby + 0 |
+-----------+
| 11 |
| 3 |
+-----------+
```
可以插入数值代替实际插入
```sql
mysql> insert into my_set (hobby) values (15);
mysql> select hobby from my_set;
+-----------------------------------+
| hobby |
+-----------------------------------+
| 篮球,足球,乒乓球 |
| 篮球,足球 |
| 篮球,足球,羽毛球,乒乓球 |
+-----------------------------------+
```
集合的意义
- 规范数据
- 节省存储空间
- enum单选
- set复选
......@@ -51,78 +51,28 @@ char 和 varchar 选择
2、如果数据超过 255 个字符,一定选择 text
## enum 枚举类型
## MySQL记录长度
例如:
```
性别 gender 男 女 保密
```
基本语法
```
enum(数据值 1,数据值 2...);
```
- 数据值列表在 255 个以内,使用 1 个字节来存储
- 数据值列表超过 255,但是小于 65535,使用 2 个字节来存储
MySQL规定:记录长度(record == 行row), 总长度不能超过65535个字节
```sql
-- Enum(0=>'男', 1=>'女', 2=>'保密')
create table my_enum(
gender enum('男', '女', '保密')
)
mysql> desc my_enum;
+--------+----------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------------+------+-----+---------+-------+
| gender | enum('男','女','保密') | YES | | NULL | |
+--------+----------------------------+------+-----+---------+-------+
-- 插入规范数据
insert into my_enum (gender) values ('男');
insert into my_enum (gender) values ('女');
mysql> select * from my_enum;
+--------+
| gender |
+--------+
| |
| |
+--------+
varchar 能够存储的理论值65535个字符,字符在不同的字符集下可能占用多个字节
```
varchar处理存储数据本身要占用空间,还需要额外的空间来保存记录长度
枚举可以规范数据
证明:varchar在MySQL中能够达到的理论值
```
utf8 65535 / 3 = 21845,需要2个字节保存长度
gbk 65535 / 2 = 32767...1,需要2个字节保存长度
```
枚举类型存储的不是真正的字符串,而是存储了下标
```sql
-- MySQL 会自动类型转换,+、-、\*、/ 会将数据转换成数值,普通字符串转换为数值 0
select gender + 0 from my_enum;
mysql> select gender + 0 from my_enum;
+------------+
| gender + 0 |
+------------+
| 1 |
| 2 |
+------------+
-- 可以直接插入数值数据
insert into my_enum (gender) values (1);
mysql> select * from my_enum;
+--------+
| gender |
+--------+
| |
| |
| |
+--------+
create table my_utf8(
name varchar(21844)
) charset utf8;
create table my_gbk(
name varchar(32766)
) charset gbk;
```
枚举的意义
- 规范数据本身,限定只能插入规定的数据项
- 节省存储空间
https://www.bilibili.com/video/BV1Vx411g7uJ?p=22&spm_id_from=pageDriver
https://www.bilibili.com/video/BV1Vx411g7uJ?p=24&spm_id_from=pageDriver
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册