MYSQL数据类型——字符串

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

定长字符串

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

Char(L): L代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255.
Char(4): 在UTF8 环境下,需要4 * 3 = 12个字节

变长字符串

变长字符串: varchar, 在分配空间的时候, 按照最大的空间分配: 但是实际上最终用了多少,是根据具体的数据来确定.

Varchar(L): L表示字符长度 理论长度是65536个字符 , 但是会多处1到2个字节来确定存储的实际长度: 但是实际上如果长度超过255,既不用定长也不用变长, 使用文本字符串text

Varchar(10): 的确存了10个汉字, utf8环境, 10 * 3 + 1 = 31(bytes)
存储了3个汉字: 3 * 3 + 1 = 10(bytes)

定长与变长的存储实际空间(UTF8)

实际存储数据 Char(4) Varchar(4) Char占用字节 Varchar(占用字节)
ABCD ABCD ABCD 4 * 3 = 12 4 * 3 + 1 = 13
A A A 4 * 3 = 12 1 * 3 + 1 = 4
ABCDE × × 数据超过长度 数据超过长度

如何选择定长或者是变长字符串呢?
定长的磁盘空间比较浪费, 但是效率高: 如果数据基本上确定长度都一样, 就是使用定长, 如身份证, 电话号码, 手机号码等

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

文本字符串

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

文本字符串根据存储的数据的格式进行分类: text和blob
Text: 存储文字(二进制数据实际上都是存储路径)
Blob: 存储二进制数据(通常不用)
在这里插入图片描述

扫描二维码关注公众号,回复: 9234257 查看本文章

枚举字符串

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

枚举的使用方式
定义: enum(可能出现的元素列表); //如enum(‘男’,’女’,’不男不女’,’妖’,’保密’);
使用: 存储数据,只能存储上面定义好的数据

-- 创建枚举表
create table my_enum(
gender enum('男','女','保密')
)charset utf8;

-- 插入数据
insert into my_enum values('男'),('保密'); -- 有效数据

-- 错误数据
insert into my_enum values('male');	-- 错误: 没有该元素

-- 将字段结果取出来进行+0运算
select gender + 0, gender from my_enum;

-- 数值插入枚举元素
insert into my_enum values(1),(2);

加入数据:
作用之一: 规范数据格式: 数据只能是规定的数据中的其中一个
作用之二: 节省存储空间(枚举通常有一个别名: 单选框): 枚举实际存储的是数值而不是字符串本身.
在mysql中,系统也是自动转换数据格式的: 而且基本与PHP一样(尤其是字符串转数字)

证明字段存储的数据是数值: 将数据取出来 + 0 就可以判断出原来的数据存的到底是字符串还是数值: 如果是字符串最终结果永远为0, 否则就是其他值.
在这里插入图片描述
找出了枚举元素的实际规律: 按照元素出现的顺序, 从1开始编号
在这里插入图片描述
枚举原理: 枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中): 然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储, 然后在进行数据提取的时候, 系统自动将数值转换成对应的字符串显示.

因为枚举实际存储的是数值,所以可以直接插入数值.

集合字符串

集合跟枚举很类似: 实际存储的是数值,而不是字符串(集合是多选)

集合使用方式:
定义: Set(元素列表)
使用: 可以使用元素列表中的元素(多个), 使用逗号分隔
在这里插入图片描述

-- 创建集合表
create table my_set(
hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
--		   足球			          台球    网球
-- 集合中: 每一个元素都是对应一个二进制位,被选中为1,没有则为0: 最后反过来
--          0      1       0         0      0       1       1     0
-- 反过来    01100010 = 98

)charset utf8;

-- 插入数据
insert into my_set values('足球,台球,网球');
insert into my_set values(3); 

-- 查看集合数据
select hobby + 0, hobby from my_set; 

-- 98转成二进制 = 64 + 32 + 2 = 01100010

-- 颠倒元素出现的顺序
insert into my_set values('网球,台球,足球');

在这里插入图片描述
在这里插入图片描述
集合中元素的顺序没有关系: 最终系统都会去匹配顺序

集合的强大在于能够规范数据和节省空间: PHP也可以规范数据, 但是对于PHP来说效率优先, 而且数据的维护可以通过数字进行, 增加PHP的维护成本: PHP根本没有办法判断数据在数据库的形式.

发布了135 篇原创文章 · 获赞 41 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u014651560/article/details/90518386