Mysql

来源:互联网 发布:智业软件ipo 编辑:程序博客网 时间:2024/06/08 14:54

在SQL中,将字符串类型分为了六类:char,varchar,text,blob,enum和set。

这里写图片描述


【1】定长字符串char

磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度。

Char(L):L代表length,可以存储的长度,单位为字符,最大长度值可以为255。

char(4):在UTF8环境下,需要4*3=12个字节存储空间。


【2】变长字符串varchar

变长字符串在分配空间的时候按照最大长度的空间分配,实际用了多少根据具体的数据来定。

Varchar(L) : L表示字符长度,理论可以存储65536个字符。会多出1-2个字节来确定存储的实际长度。如果字符长度大于255,那么既不使用定长,也不使用变长,而是使用文本字符串text

Varchar(10):储存10个汉字,UTF8下使用10*3+1=31个字节(大于255使用两个字节存储)。

以下占用字节,均表示在分配空间的时候所需要的字节(字符概念,一个字符使用三个字节存储-UTF8),如A占用字节为3,但是MySQL自身存储的时候会使用一个字节存储(会对英文字母和符号进行优化):

这里写图片描述

在生产环境中如何选择定长或者变长字符串类型呢?

定长的磁盘空间比较浪费,但是效率高:如果数据长度基本一样,就选择定长;如身份证,手机号码等。

变长的磁盘空间比较节省,但是效率低:如果数据不能确定长度(不同数据长度有变化),如姓名,地址等。


【3】文本字符串

如果数据量超过255个字符,通常会使用文本字符串。

文本字符串根据存储的数据格式进行分类:

Text:存储文字;
Blob:存储二进制数据,如图片、音频等。

通常二进制数据实际上数据库存储路径,物理文件放在磁盘上面。


【4】枚举

枚举:enum,事先将所有出现的结果都设计好,实际存储的数据必须是预先规定的数据的一个。

其作用如下:

① 规范数据格式,数据只能是规定的数据中的其中一个;

② 节省存储空间,枚举通常有一个别名-单选框;枚举实际存储的是数值而不是字符串本身。

create table my_enum(gender enum('男','女','保密'))charset utf8;desc my_enum;

这里写图片描述

测试如下:

insert into my_enum VALUES('男');--有效数据insert into my_enum VALUES('人妖');--无效数据

这里写图片描述

insert into my_enum VALUES('男女');--无效数据

这里写图片描述


Tips:

在MySQL中,系统也是自动转换数据格式的,尤其是字符串转数字。如字符串若非数字,将转换为0;若以数字开头则转换为对应的开头数字。

select 1+'hello',1+'1hello',1+'2hello','1.0hello',1+'1.1hello',1+'1.1.1hello',1+'1.2.1hello';

这里写图片描述


查看一下刚才插入的数据在MySQL是如何存储的:

select gender, gender+0 from my_enum 

这里写图片描述


枚举原理如下】:

枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中)。

在进行数据插入的时候,系统自动将字符转换成对应的数字进行存储;然后在进行数据提取的时候,系统将其转换为字符进行显示。

枚举插入数字:

insert into my_enum VALUES('1'),('2'),('3');--会插入'关系'中对应的字符串,存储的是字符串对应的数字;
select gender, gender+0 from my_enum 

这里写图片描述


【5】集合字符串

集合跟枚举很相似,实际存的是数字而不是字符串本身(集合是多选),区别与枚举,别名可以称为复选框!!!

Set(元素列表),可以使用元素列表中的多个元素,元素之间可以使用逗号分隔。

这里写图片描述

说明:1,2,3,4,8 ;分别对应tinyint,smallint,mediumint,int,bigint。在底层存储的时候,使用整型存储的(存储字符对应的数字,而不是字符本身,参考enum)。

如有8个元素,那么使用1个子节存储(tinyint);16个元素使用两个字节存储(smallint);33个元素使用8个字节存储(bigint)。远比varchar或者char占用磁盘空间少得多。

如果是varchar,8个元素,那么需要24+1=25个字节;但是set只需要1个字节。


create table my_set(hobby SET('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球'))charset utf8;DESCRIBE my_set

这里写图片描述

insert into my_set VALUES('足球,篮球');--插入的时候不用考虑顺序,服务器存储的时候会自动寻找对应位置,看下面分析。。insert into my_set VALUES('足球');insert into my_set VALUES('足球篮球');--无效数据,未用逗号分隔insert into my_set VALUES('小球,篮球');--不存在的数据insert into my_set VALUES(4);--直接插入数字.....
select hobby,hobby+0 from my_set ORDER BY hobby ASC;

这里写图片描述


是不是存的数字出乎意料?不再是1,2,3。。。

分析如下图:

这里写图片描述

那么插入数字255时(因为八个位全为1),对应全部字符串:

insert into my_set VALUES(255);select hobby,hobby+0 from my_set ORDER BY hobby ASC;

这里写图片描述

set如此节省磁盘空间,但是生产中并未常使用!因为效率优先!!!所以enum和set使用频率并不如varchar高!!!

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 青少年左侧后背突发疼痛怎么办 纵欲过度导致青少年白发怎么办 20岁了不想长大怎么办 网吧老板跑路了怎么办 网吧玩地下城卡怎么办 个人公积金封存之前厂子欠费怎么办 学生欠了2万块怎么办 玉米去完库存量cool怎么办 幸福蓝海电子券过期怎么办 幸福蓝海国际影城会员怎么办 幸福蓝海会员卡过期了怎么办 电机线圈处于平衡位置怎么办 混联电路求电功率最小怎么办 电脑超出工作频率范围怎么办 手机红外线感应器坏了怎么办 我的世界左右慢怎么办 发电机自动启停装置故障怎么办 如果自动启停没关发动机涉水怎么办 偏激的人不分手怎么办 被极端的人纠缠怎么办 对固执偏激的人怎么办 车子右前轮偏磨怎么办? 轮胎边缘磨黑了怎么办 36周胎儿绕颈一周怎么办 孕中期胎儿偏小怎么办 怀孕34周偏小2周怎么办 胎盘低怎么办6个月了 怀孕四个月胎盘低怎么办 怀孕五个月胎盘低怎么办 怀孕3个月胎盘低怎么办 怀孕三个月了胎盘低怎么办 新房交房开发商拿不出证件怎么办? 新干式变压器未送电进水怎么办 三相380转单相220怎么办 外国人一直找你出去怎么办 美团众包跑腿单物品太重怎么办 美团退款成功后 物品怎么办 win10电脑没有网络图标怎么办 电脑开机桌面什么都没有怎么办 xp桌面什么都没有了怎么办 手机下滑通知栏不见了怎么办