发表于: 2020-08-15 23:27:08
1 1324
今天完成的事情
1. 数据库的存储方式
2. 了解 jpa,做了简单的 demo,但是更改原有项目没有完成
收获
存储机制:
创建数据表的时候我们就使用数据类型来限定每个字段所占用的地址空间,超出地址空间的处理方式有两种,截断不存或者使用额外的信息来标注是否在另外的地方存储了一些数据。
整形的存储(int、tinyint···)
由于整形数据的值是直接通过 bit 信息来读取的,所以整形可以存储的数据是按照位(byte)来计算的。
一个 int 类型的字段占用 4 byte,共计 32 bit,可以存储连续的 2^32 个整形数字。
在 MySQL 数据库中我们存储整形的时候可以使用一个参数 M,这是一个正整数例如 int(4)、tinyint(2)。这个参数并不影响整形字段存储的数据量,通常是用来配合 zerofill 在数字前面补充 0 的个数以此来控制数字的显示宽度。
这里需要注意的事情是,如果在一个字段上开启了 zerofill,那么这个字段就自动变成了无符号类型。无法存储负数。
字符类型的存储方式(char、varchar、text)
char 类型的是定长字符串,严格的限定了空间长度,但是它限制的是字符数量而不是字节数(某个版本以前的是限制的字节数),超出的部分直接截断不会存储。
在 char 类型存储的时候如果字符串的长度不及存储的长度,那么会使用空格补齐。在取出的时候会自动删除尾随的空格,即使我们在存储的时候是特意在尾部留了空格,数据库取出的时候也会去掉。对于数据库来说 "abc" 与 "abc " 并没有区别。
varchar 类型是变长字符串类型,它存储了额外的字节的 bit 位来标记某个字节是否存储了数据。每存储一个字节(byte)的数据就要使用一个比特位来记录。因此一个额外的标记字节就可以标记 256 字节(byte)的数据,两个额外的记录字节可以标记 65536 字节的数据。MySQL 限制了 varchar 最多只能用两个字节来标记数据,所以对于单字节的字符,最多可以存储 65536 个字符的数据。对于多字节的字符,比如 UTF-8 每个字符占用三个字节,varchar 最多可以存储 65536/3=21845 个 UTF-8 字符数据。
由于使用了标记位来标记存储的字符数据,就不会和 char 一样截取尾部的空格。
varchar(10) 与 char(10) 一样,只能够存储 10 个字符,多余的截取不存。
ENUM 数据类型
在该类型中插入的数据只能是插入预先定义的 value 或者 null。插入其他的值或者空('')都会被截断为空数据。存储的时候会忽略大小写(转换为定义的时候的状态),而且会阶段尾部的空格。
ENUM 使用 index 来存储数据,所以理论上一个字节可以存储 256 条 value,实际上 null 也会占用空间。MySQL 限制最多只能够存储 65536 个 value。
需要注意的是,尽量不要使用 ENUM 来存储数值类型,因为无论是排序、检索还是其他操作都是根据 index 值来判定的。这会导致一些误解,和我们所需要的效果会有偏差。
SET 数据类型
SET 与 ENUM 类似,可以在数据库中存入定义的 SET 中任意值的组合。如 set('a', 'b', 'c', 'd') 字段中可以存入 'a, b' 或者 'a, b, c' 等数据。
值之间使用逗号做区分,所以数据本身不可以有空格。如果存入的内容不在 set 中则会存储为空值,重复的内容会被忽略。
SET 数据类型占用的存储空间与 SET 成员数量 M 有关,计算方式为 (M + 7)/8 取整。
MySQL 限制最多只能有 64 个成员。
使用以下语句来检索 set 字段数据。
find_in_set(set_value,set_column_name)
明天的计划
1. 继续完成 jpa 的学习
2. 看项目了解 dal
评论