From edeb48ddcd5f0fe9c2e96c283b2a34e0ffb784a7 Mon Sep 17 00:00:00 2001 From: pengshiyu <1940607002@qq.com> Date: Wed, 23 Mar 2022 09:41:07 +0800 Subject: [PATCH] fix --- blog/php-mysql/index.md | 4 ++ blog/php-mysql/sql-enum.md | 79 +++++++++++++++++++++++++ blog/php-mysql/sql-set.md | 109 +++++++++++++++++++++++++++++++++++ blog/php-mysql/sql-string.md | 82 +++++--------------------- 4 files changed, 208 insertions(+), 66 deletions(-) create mode 100644 blog/php-mysql/sql-enum.md create mode 100644 blog/php-mysql/sql-set.md diff --git a/blog/php-mysql/index.md b/blog/php-mysql/index.md index 0adef26..28783c3 100644 --- a/blog/php-mysql/index.md +++ b/blog/php-mysql/index.md @@ -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) diff --git a/blog/php-mysql/sql-enum.md b/blog/php-mysql/sql-enum.md new file mode 100644 index 0000000..3dd213c --- /dev/null +++ b/blog/php-mysql/sql-enum.md @@ -0,0 +1,79 @@ +# 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 | ++--------+ +| 男 | +| 女 | +| 男 | ++--------+ + +``` + +枚举的意义 + +- 规范数据本身,限定只能插入规定的数据项 +- 节省存储空间 + diff --git a/blog/php-mysql/sql-set.md b/blog/php-mysql/sql-set.md new file mode 100644 index 0000000..12899a9 --- /dev/null +++ b/blog/php-mysql/sql-set.md @@ -0,0 +1,109 @@ +# 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复选 + + diff --git a/blog/php-mysql/sql-string.md b/blog/php-mysql/sql-string.md index c459929..8ad6423 100644 --- a/blog/php-mysql/sql-string.md +++ b/blog/php-mysql/sql-string.md @@ -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 -- GitLab