mysql基础(10)_列类型之字符串型【二】_text、enum

Text

文本类型:本质上mysql提供了两种文本类型
Text:存储普通的字符文本,英文存储区分大小写
Blob:存储二进制文本(图片,文件),英文存储不区分大小写,一般都不会使用blob来存储文件本身,通常是使用一个链接来指向对应的文件本身。

系统中提供的四种text:(L代表字符数)
Tinytext:系统使用一个字节来保存数据所在的位置,实际能够存储的数据长度为:L + 1 bytes, where L < 2^8
Text:使用两个字节保存,实际存储为: L + 2 bytes, where L < 2^16
Mediumtext:使用三个字节保存,实际存储为:L + 3 bytes, where L < 2^24
Longtext:使用四个字节保存,实际存储为:  L + 4 bytes, where L < 2^32

注意:
1、在选择对应的存储文本的时候,不用刻意去选择text类型,系统会自动根据存储的数据长度来选择合适的文本类型。
2、在选择字符存储的时候,如果数据超过255个字符,那么一定选择text存储。(此时不需要用varchar(L),效率不如text,更能节省空间)

Enum

枚举类型:在数据插入之前先设定几个项,这几个项就是可能最终出现的数据结果。

什么时候使用枚举?
如果确定某个字段的数据只有那么几个值:如性别,男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值

基本语法:enum(数据值1,数据值2...)

存储:系统提供了1到2个字节来存储枚举数据,通过计算enum列举的具体值来选择实际的存储空间(如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。)

枚举文字的索引值
ENUM 类型中的任何一个枚举值都有一个内部的数字索引:所以在创建表结构时指定的枚举值都会分配一个内部索引,索引的下标从 1 开始

注意:下标并不是从0开始。如果插入设定值外的其它字符,则视为空字符串,空字符串作为错误值的索引值为0,正因如此,我们可以使用select语句来查询那些插入的或更新的无效的枚举值SELECT * FROM tbl_name WHERE enum_column=0;另外NULL的索引为NULL,删除字段值为null的条件写成where fieldname=null是错误的,正确的写法应该是:delete from tablename where fieldname is null

枚举enum的存储原理分析:在mysql中系统是自动进行类型转换的,如果数据碰到"+、-、*、/"系统就会自动将数据转换成数值,而普通字符串转换成数值为0。实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标,当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始。

Enum(1=>'男',2=>'女',3=>'保密') 相当于数组,可通过 Select 字段名 +0 from 表名; 查询下标,既然实际enum字段存储的结果是数值,那么在进行数据插入的时候,就可以使用对应的数值来进行。经实验,枚举列表内容更新或删除时需要慎重,如图,具体原因目前尚未找到。

mysql> create table chartype_enum(
    -> gender enum('男','女','保密','null')
    -> )charset=utf8;
Query OK, 0 rows affected (1.76 sec)

mysql> insert into chartype_enum values('男');
Query OK, 1 row affected (0.00 sec)
mysql> insert into chartype_enum values('保密');
Query OK, 1 row affected (0.00 sec)
mysql> insert into chartype_enum values('女');
Query OK, 1 row affected (0.00 sec)
mysql> insert into chartype_enum values('remale');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into chartype_enum values('null');
Query OK, 1 row affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
|        |
| null   |
+--------+
5 rows in set (0.00 sec)

mysql> select gender +0 from chartype_enum;
+-----------+
| gender +0 |
+-----------+
|         1 |
|         3 |
|         2 |
|         0 |
|         4 |
+-----------+
5 rows in set (0.00 sec)

mysql> alter table chartype_enum modify gender enum('男','女','保密');
Query OK, 5 rows affected, 1 warning (1.78 sec)
Records: 5  Duplicates: 0  Warnings: 1

mysql> select gender +0 from chartype_enum;
+-----------+
| gender +0 |
+-----------+
|         1 |
|         3 |
|         2 |
|         0 |
|         0 |
+-----------+
5 rows in set (0.00 sec)

mysql> delete from chartype_enum where gender=0;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
+--------+
3 rows in set (0.00 sec)

-- 为什么插入数值出现错误呢?此处怀疑是删除枚举列表值时下标索引没有更新,因此建议枚举列表更改需要慎重!!!
mysql> insert into chartype_enum values(2);
Query OK, 1 row affected (0.00 sec)

mysql> insert into chartype_enum values(3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
| 保密   |
| 女     |
+--------+
5 rows in set (0.00 sec)

-- 此处以及之后又正常插入了,奇了怪了
mysql> insert into chartype_enum values(3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from chartype_enum;
+--------+
| gender |
+--------+
| 男     |
| 保密   |
| 女     |
| 保密   |
| 女     |
| 保密   |
+--------+
6 rows in set (0.00 sec)

枚举的意义:
1、规范数据本身,限定只能插入规定的数据项
2、节省存储空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值