在 SQL 中,将字符串类型分成了 6 类,分别为:char
、varchar
、text
、blob
、enum
和set
.
第一类 定长字符串
定长字符串(char): 即磁盘(二维表)在定义结构的时候就已经确定了最终数据的存储长度。
char(L)
:L 表示 Length,即可以存储的长度,单位为字符,最大长度为 255;char(4)
:表示在 UTF8 环境下,需要 4*3=12 个字节。
第二类 变长字符串
varchar(L)
:L 表示 Length,理论长度是 65536,但是会多出 1 到 2 个字节来确定存储的实际长度;varchar(10)
:例如存储 10 个汉字,在 UTF8 环境下,需要 10*3+1=31 个字节。
实际上,如果存储长度超过 255 个字符,则既不用定长字符串也不用变长字符串,而是用文本字符串text
.
如何选择定长字符串和变长字符串:
定长字符串对磁盘空间有些浪费,但是效率高;如果数据基本上确定长度都一样,就使用定长字符串,例如身份证号,学号,电话号等;
变长字符串对磁盘空间比较节省,但是效率低;如果数据不能确定长度,就使用变长字符串,例如姓名,地址等;
第三类 文本字符串
一般来说超过255个字符就会使用文本字符串
text: 存储文字
blob: 存储二进制数据(存储路径使用)
第四类 枚举字符串
enum:需要先将所有可能出现的结果都设计好,实际上存储的数据必然是已经设计好的数据其中之一
mysql> create table if not exists practice.my_enum( -> gender enum('男','女','保密') -> )charset utf8;Query OK, 0 rows affected
我们查看一下这张表:
mysql> desc my_enum;+--------+------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+------------------------+------+-----+---------+-------+| gender | enum('男','女','保密') | YES | | NULL | |+--------+------------------------+------+-----+---------+-------+1 row in set
如图,如果我想添加几条信息:
1. 使用enum中已有字符
mysql> insert into my_enum values('男'),('女'),('保密');Query OK, 3 rows affectedRecords: 3 Duplicates: 0 Warnings: 0
2.使用数值对应enum中字符
mysql> insert into my_enum values(1);Query OK, 1 row affected
如果没有使用表中已有数据:
mysql> insert into my_enum values('人妖');1265 - Data truncated for column 'gender' at row 1
查看表中信息:
mysql> select * from my_enum;+--------+| gender |+--------+| 男 || 女 || 保密 || 男 |+--------+4 rows in set
使用枚举字符串的好处:
1. 规范数据格式,插入的数据只能是之前定义好的数据之一
2. 节省存储空间,枚举实际上存储的是数据本身而不是字符串
证明枚举字段存储的是数值
具体方法为:将数据取出来+0
,如果是字符串最终结果永远为0
,否则就是其他值。
mysql> select gender + 0,gender from my_enum;+------------+--------+| gender + 0 | gender |+------------+--------+| 1 | 男 || 2 | 女 || 3 | 保密 || 1 | 男 |+------------+--------+4 rows in set
枚举原理:枚举在进行数据规范(定义)的时候,系统会自动建立一个数字与枚举元素的对应关系(放在日志中);在进行数据插入的时候,系统自动将字符串转换为对应的数值进行存储;在进行数据提取的时候,系统自动将数值转换成对应的字符串进行显示。
第五类 集合字符串
set: 与枚举类似,存储的是数值而不是字符串
创建并查询表结构:
Query OK, 0 rows affectedmysql> desc my_set;+--------+------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+------------------------+------+-----+---------+-------+| gender | enum('男','女','保密') | YES | | NULL | |+--------+------------------------+------+-----+---------+-------+1 row in set