【2.0】数据库知识点小结数据库进阶
【2.0】数据库知识点小结数据库进阶
【一】存储引擎
- 日常生活中文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制
- 针对不同的数据应该有对应的不同的处理机制
存储引擎就是不同的处理机制
MySQL主要的存储引擎
Innodb
- 是MySQL5.5版本之后的默认存储引擎
- 支持事务/行锁/外键
myisam
- 是MySQL5.5版本之前的默认存储引擎
- 速度比innodb快,但是数据安全较弱
memory
- 内存引擎
- 数据全部存放在内存中
- 存储速度快,但是断电数据丢失
blackhole
- 黑洞引擎
- 无论存什么都会立刻消失
查看所有的数据库存储引擎
不同的存储引擎存储数据的异同点
创建表
- t1.frm
- 表结构
- t1.ibd
- 表结构
Innodb:默认的引擎
- t2.frm
- 表结构
- t2.MYD
- 表数据
- t2.MYI
- 索引(index),类似于书的目录,基于目录查找数据的速度会很快
myisam:数据具有索引,读取数据快
- t3.frm
- 表结构
blackhole:黑洞引擎,存什么数据都会消失
- t4.frm
- 表结构
memory:数据缓存到内存
存储数据
查看数据
- 可以发现除了黑洞引擎,其他引擎所在的表内都存在数据
- memory 数据是存在内存中的,如何印证?
- 重启mysql服务
- memory 数据是存在内存中的,如何印证?
- 可以发现memory 表中的数据已经不存在了
【二】创建表的完整语法
【一】完整语法
同一张表中字段名不能重复
宽度和约束条件是可选的(可写可不写)
- 约束条件可以写多个
字段名和字段类型是必须的
- 需要加字段类型
-
最后一行不能加逗号
- 删除 逗号
- 查看表的详细信息
【二】补充
【1】宽度:
- 一般情况下指的是对存储数据的限制
- 默认宽度为 1(只能存一个字符)
- 创建表
- 查看表的详细信息
- 默认宽度为 1(只能存一个字符)
指定数据长度插入数据
- 5.6 版本默认没有开启严格模式,规定只能存一个字符,给多了字符就会自动截取一个字符
- 5.7 版本及以上开启了严格模式,那么规定存几个就只能存几个,不能超出,一旦超出就会报上面的错误
数据插入的数null
- 插入数据
- 查看数据
- 默认允许插入 空
【2】约束条件 null / not null
- 创建表
- 查看数据
name字段的 null 是 No 不能为空
- 插入数据
尴尬 name 没加限制 太短了
- 再次插入数据(长度为 1 )
- 查看数据
- 再次插入数据长度为空
限制了name字段不能为空
【3】宽度和约束条件之间的联系
- 宽度是用来限制数据的存储
- 约束条件是在宽度的基础上增加的额外的约束
【4】严格模式到底开启还是不开启
- 5.7 之后的版本默认都是开启严格模式的
- 尽量减轻数据库的负担,不给数据库增加额外的压力
【三】基本数据类型
【1】整型
整型默认情况下都是带有符号的
针对整型()内的符号到底是什么用?
针对整型,括号内的宽度是用来限制存储数据的范围的
特例:
只有整型括号内的数字不是表示限制位数而是显示长度
-
分类
-
作用
- 存储年龄、ID、等级、号码等
整数类型 | 字节 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0~255 | -128~127 |
SMALLINT | 2 | 0~65535 | -32768~32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608~8388607 |
INT | 4 | 0~4294967295 | -2147483648~2147483647 |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854774808~9223372036854774807 |
以TINYINT存储数据
- 是否有符号
- 默认情况下是带符号的
- 超出最大范围会如何
- 超出限制只能存最大接受值
(1)TINYINT存储数据超出最大范围会如何
- 创建表
- 查看表
表中已经有了相应的数据格式
TINYINT 有符号最大限制 -128~127
- 插入数据
- 插入数据
- 查看表
- 默认情况下是带符号的
- 超出限制只能存最大接受值
(2)约束条件之unsigned(无符号)
- 创建表(约束条件:
tinyint unsigned
)
- 查看表
- 插入数据
- 查看数据
针对整型()内的符号到底是什么用?
针对整型,括号内的宽度是用来限制存储数据的范围的
- 创建表
- 查看表
- 插入数据
- 查看表
限制了 8 存储了 9 位
特例:
只有整型括号内的数字不是表示限制位数而是显示长度
id int(8)
如果数字没有超出 8 位 ,那么默认用 0 填充至 8 位
如果数字超出 8 位 ,那么 有几位存几位(但是还是要遵循最大范围)
- 插入数据
- 查看表
按理来说是应该用 0 填充的,但是为什么看不见 0 呢?
(1)约束条件之 zerofill
- 创建表(无符号,用 0 填充至 8 位)
- 查看表
- 插入数据
- 查看表
数字不够 8 位 用 0 填充
总结
- 针对整型字段,无需指定宽度,因为它默认的宽度已经足够展示所有数据了
【2】严格模式
(1)如何查看严格模式
sql_mode(严格模式):
(2)模糊匹配/查询like "%mode"
关键字 : like
%
- 匹配任意多个字符
_
- 只能匹配单个字符
(3)修改严格模式
只在当前窗口有效
全局有效
- 语法(严格模式)
修改完成后,重启服务端,即可生效
【3】浮点型
-
分类
- FLOAT DOUBLE DECIMAL
-
作用
数据类型 | 字节数 | 取值范围 |
---|---|---|
FLOAT | 4 | -2^128~2 ^128,即-3.40E+38~+3.40E+38 |
DOUBLE | 8 | -2^1024~ 2^1024,即-1.79E+308~1.79E+308 |
DECIMAL | 设置位数和精度。 | 65 ~ 30 |
(1)存储限制
(2)精确度验证
- 创建表
- 查看表
- 插入数据
- 查看数据
可以很明显的发现每一个类型的精确度有明显的区别
float < double < decimal
虽然每个类型的精确度不一,但是可以根据实际情况选择对应的数据类型
【4】字符类型
-
分类
-
CHAR
- 定长
-
VARCHAR
- 变长
-
(1)char 与 varchar 的比较
- 创建表
- 查看表
- 插入数据
- 插入数据(超出字符范围)
- 查看表
我们可以观察到,通过这种方式无法直观地看到我们想要的效果
(2)补充 char_length
char_length
:统计字段长度
- char 在硬盘上存的绝对是真正的数据,带有空格
- 但是在现实的时候MySQL会自动将多余的空格删除
(3)解决办法 - 取消方法
再次修改 sql_mode 让MySQL不做自动剔除操作
- 查看命令
- 修改命令
要在原有的基础上进行替换,所以要带有原有的属性
- 再次运行查询命令
- char 在硬盘上存的绝对是真正的数据,带有空格
- 但是在现实的时候MySQL会自动将多余的空格删除
(4)char
与 varchar
的比较
- char
- 缺点:浪费空间
- 优点:存储简单
- 直接按照固定的字符存储数据即可
- varchar
- 优点:节省空间
- 缺点:存储麻烦
- 存的时候,在真正数据的前面加报头(表示数据真正大小)
- 取的时候,需要先读取报头,才能读取真实的数据
以前用 char 现在 varchar 使用较多
【5】时间类型
-
分类
- date
- 年月日
- datetime
- 年月日时分秒
- time
- 时分秒
- year
- 年
- date
-
创建表
- 插入数据
- 查看表
- 查看表数据
【6】枚举与集合类型
(1)枚举与集合
枚举(enum):多选一
枚举类型存储数据只能从候选项中选取一个才行
集合(set):多选多
(2)使用
枚举
- 创建表
- 查看表
- 插入数据
- 查看表数据
正常插入
- 插入数据
枚举类型存储数据只能从候选项中选取一个才行
集合
- 创建表
- 查看表
- 插入数据
- 查看数据
- 插入数据
- 查看数据
- 插入数据
集合类型
可以多选
不允许不选,错选
【四】小结
【1】字段类型
数值类型:
- INT:整数类型,通常用于存储整数值。
- BIGINT:大整数类型,可以存储更大范围的整数值。
- DECIMAL:高精度浮点数类型,用于存储具有精确小数位的数值。
字符串类型:
- CHAR:定长字符串类型,存储固定长度的字符。
- VARCHAR:变长字符串类型,存储可变长度的字符。
- TEXT:用于存储较长的文本内容。
日期和时间类型:
- DATE:仅存储日期。
- TIME:仅存储时间。
- DATETIME:存储日期和时间。
- TIMESTAMP:存储日期和时间,并自动记录修改时间戳。
枚举和集合类型:
- ENUM:用于存储预定义的枚举值。
- SET:用于存储多个预定义值的集合。
【2】严格模式
- 严格模式(Strict Mode)是MySQL数据库的一种运行模式,它对于数据的完整性和准确性有更严格的要求。
- 使用严格模式可以帮助开发人员在数据操作中发现和修复潜在的问题,提高数据的一致性和可靠性。
在严格模式下,MySQL会进行以下检查:
-
严格的数据类型检查:MySQL会根据表定义的字段类型和长度进行严格的数据验证,不允许非法的数据插入。比如,如果一个字段定义为整数类型,但插入了一个字符串,则会产生错误。
-
禁止隐式转换:MySQL不会自动将一种数据类型隐式转换为另一种数据类型,从而避免因为隐式转换引起的数据不准确或截断的问题。
-
非空字段检查:MySQL会检查非空字段是否为空,如果为空则会报错。
-
严格模式下的零值插入:在严格模式下,MySQL对于插入零值(如或'')会更加严格,例如不允许将一个非零值插入到定义为无符号整数的字段中。
启用严格模式可以通过以下方式之一实现:
-
在连接数据库时指定参数:可以在连接字符串中加上
STRICT_TRANS_TABLES
或STRICT_ALL_TABLES
参数来开启严格模式。 -
修改配置文件:可以在MySQL的配置文件(通常是my.cnf或my.ini)中设置
sql_mode
参数,添加或修改相关模式来启用或禁用严格模式。
需要注意的是,严格模式可能导致一些旧有的应用程序出现问题,因为它要求更加严格的数据验证和操作。
因此,在启用严格模式之前,应该进行充分的测试和评估,确保应用程序能够适应这种模式下的变化。
【3】约束条件
(1)not null
not null
约束条件用于指定某个字段不能为空。- 这意味着在插入或更新数据时,该字段必须包含有效的值,而不能为NULL。
- 通过添加
not null
约束,可以防止插入或更新操作中出现空值,确保数据的完整性。
(2)zerofill
zerofill
约束条件用于指定某个字段的数据以零填充。- 当使用
zerofill
约束时,如果字段被赋予较短的值,MySQL将使用来填充该字段的剩余空间。- 例如,如果一个字段定义为
INT(5) ZEROFILL
- 并且赋值为123
- 则存储在数据库中的值将是00123。
- 这样做可以确保字段的固定长度,方便进行比较和处理。
- 例如,如果一个字段定义为
(3)unsigned
unsigned
约束条件用于指定某个字段只能包含非负数(正整数或零)。- 当将字段定义为
unsigned
时,它会限制该字段的取值范围为大于等于零的整数。 - 这对于表示计数器、年龄、数量等非负数值的字段非常有用。
__EOF__

本文链接:https://www.cnblogs.com/dream-ze/p/17517794.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17517794.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步