首页 > 其他分享 >存储引擎及特点、约束条件、严格模式、基本字段类型(整型、浮点型、字符串、日期时间、枚举和集合)

存储引擎及特点、约束条件、严格模式、基本字段类型(整型、浮点型、字符串、日期时间、枚举和集合)

时间:2024-06-05 21:14:12浏览次数:24  
标签:name -- 浮点 枚举 values 整型 id select mode

【一】存储引擎

  • 在平常我们处理的文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制
  • 针对不同的数据应该有对应不同的处理机制
  • 存储引擎就是不同的处理机制。
# 查看所有引擎
show engines;

四种主要的存储引擎

(1)Innodb引擎

  • 是MySQL5.5版本之后的默认存储引擎
  • 支持事务/行锁/外键

(2)myisam引擎

  • 是MySQL5.5版本之前的默认存储引擎
  • 速度比innodb快,但是数据安全较弱

(3)memory引擎

  • 内存引擎
  • 数据全部存放在内存中
  • 存储速度快,但是断电数据丢失

(4)blackhole引擎

  • 黑洞引擎
  • 无论存什么都会立刻消失

【二】MySQL主要的存储引擎特点

  • 利用不同的引擎创建表,向表中插入数据比较每一种引擎的特点

【1】建表语句

create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;

【2】innodb引擎

  • t1.frm

    • 存储表结构
  • t1.ibd

    • 存储表数据
  • 特点:存储数据持久化,即使断开连接也存在

【3】myisam引擎

  • t2.frm

    • 表结构
  • t2.MYD

    • 表数据
  • t2.MYI

    • 索引(index),类似于书的目录,基于目录查找数据的速度会很快
  • 特点:存储数据持久化,退出也存在。

【4】memory引擎

  • t3.frm

    • 表结构
  • 特点:基于内存存储,只要服务重启,所有数据丢失。

【5】blackhole引擎

  • t4.frm

    • 表结构
  • 特点:存储数据不会有任何反应,不会存储任何数据

【三】约束条件

  • 约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败!
  • 约束条件在创建表时可以使用, 也可以修改表的时候添加约束条件

【1】概览

  • 非空约束(not null)
  • 唯一性约束(unique)
  • 组合使用 not null 和 unique
  • 主键约束PK(primary key)
  • 外键约束FK(foreign key)
  • 级联更新与级联删除

ps:创建表结构时,约束条件直接跟在字段后面的为列级约束,若约束条件是用括号时为表级约束。

使用表级约束给多个字段联合添加约束,如:unique(name,email)名字和邮箱这两个字段不能同时重复。

【2】非空约束(not null)

(1)作用

  • not null约束的字段不能为 NULL 值,必须赋具体数据

(2)示例

  • 创建 t_user 表(name,id,address)其中 id 不能为空。
create table t_user(
	name varchar(16),
    id int(6) not null,
    address varchar(128)
);
mysql> create table t_user(
    -> name varchar(16),
    ->     id int(6) not null,
    ->     address varchar(128)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(16)  | YES  |     | NULL    |       |
| id      | int(6)       | NO   |     | NULL    |       |
| address | varchar(128) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

# 由于给 id 设置为 not null 所以在插入数据的时候
# 必须给 id 赋值 否则报错
# 没有设置为 not null 的字段 ,不赋值是不会报错的
mysql> insert into t_user(name,address) values("chosen","Shanghai");
ERROR 1364 (HY000): Field 'id' doesn't have a default value

【3】唯一性约束(unique)

(1)作用

  • unique 约束的字段具有唯一性,不可重复,但是可以为空置(null)

(2)示例

alter table t_user modify name varchar(128) unique;


mysql> select * from t_user;
+------+-----+----------+
| name | id  | address  |
+------+-----+----------+
| max  | 123 | Shanghai |
| NULL | 123 | Shanghai |
+------+-----+----------+
2 rows in set (0.00 sec)

# 由于给 name 设置了唯一性(unique)
# 所以当 name 再一次赋值 “max” 时 会报错。
mysql> insert into t_user(name,id,address) values("max",456,"Shanghai");
ERROR 1062 (23000): Duplicate entry 'max' for key 'name'

【4】组合使用

(1)not null 和 unique 同时使用

  • 被 not null 和 unique 约束的字段,该字段即不能为 NULL 也不能重复;
  • 创建表
create table t_user(
  id int(10) ,
  name varchar(32) not null unique
);

【四】严格模式

  • 控制 MySQL 里面存储数据的一些限制规则

  • 控制超出长度不提示,控制超出长度提示报错

  • 查看严格模式

show variables like "%mode";

show variables like "_mode";
-- 查看严格模式的查询方式有两种
-- SQL中的模糊查询 like 喜欢 / 像
-- like "%mode"  % 匹配任意个字符
-- like "_mode"  _ 只能匹配单个字符
mysql> show variables like "%mode";
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name            | Value                                                                                                                                     |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| block_encryption_mode    | aes-128-ecb                                                                                                                               |
| gtid_mode                | OFF                                                                                                                                       |
| innodb_autoinc_lock_mode | 1                                                                                                                                         |
| innodb_strict_mode       | ON                                                                                                                                        |
| offline_mode             | OFF                                                                                                                                       |
| pseudo_slave_mode        | OFF                                                                                                                                       |
| rbr_exec_mode            | STRICT                                                                                                                                    |
| slave_exec_mode          | STRICT                                                                                                                                    |
| sql_mode                 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set, 1 warning (0.00 sec)
  • 某些情况下我们想要关闭某个严格模式
-- 临时修改 : 退出客户端重新连接,修改后严格模式还是原来的
set session sql_mode = 'STRICT_TRANS_TABLES'
-- 永久修改 : 退出客户端重新连接,严格模式修改会一直生效
set global sql_mode = 'STRICT_TRANS_TABLES'

【五】基本字段类型之整型

【1】整型

整数类型 字节 无符号数的取值范围 有符号数的取值范围
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

【2】有符号和无符号

  • 创建表(约束条件:tinyint unsigned)
-- unsigned 无符号

create table t6(id tinyint unsigned);

# 示例
insert into t6 values(-128);

【3】字段类型的宽度

  • 字段类型后面跟着的宽度只是显示的宽度

  • 插入的长度是按照谁当前字段的最大长度进行限制

  • 特例:

    • 只有整型括号内的数据表示表示限制位数而是显示长度
    • id int(8):如果数字没有超出8位,那么默认用0填充至8位
    • 如果数字超出8位,那么有几位存几位(但是还是遵循最大范围)

【4】约束条件之zerofill

create table t8(id int(8) unsigned zerofill);

# 查看表信息
desc t8;

# 插入数据
insert into t8 values(1);
insert into t8 values(123456789);

# 查看表数据
select * from t8;

【六】字段类型之浮点型

【1】浮点型

数据类型 字节数 取值范围
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
float(255,30)
# 总共255位 , 小数部分占 30 位,小数位数大于等于30位的时候,从第8位开始错乱

double(255,30)
# 总共255位 , 小数部分占 30 位,比float精度高。小数位数大于等于30位的时候,从第16位开始错乱

decimal(65,30)
# 总共65位 , 小数部分占 30 位,更加精确的科学技术,小数位数大于等于30位的时候,从第23位开始错乱
create table t9(id float(255,30));
create table t10(id double(255,30));
create table t11(id decimal(65,30));

# 插入数据
insert into t9 values(1.1111111111111111111111);
insert into t10 values(1.1111111111111111111111);
insert into t11 values(1.1111111111111111111111);

# 查看表数据
select * from t9;
select * from t10;
select * from t11;
  • 输出结果
mysql> select * from t9;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t10;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t11;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111111111100000000 |
+----------------------------------+
1 row in set (0.00 sec)

【2】总结

-- float 类型 从第8为开始模糊
-- double 类型 从第16为开始模糊
-- decimal 类型 从23为开始模糊

--- 精确度 decimal > double > float

【七】字段类型之字符串类型

【1】字符串类型

(1)char

-- 定长字符串 , 给长度 4 位,超出会报错,不够默认用空格补全

(2)varchar

-- 不定长字段,给 4 个长度,超过四个直接报错,有几个存几个

【2】char 与 varchar 的比较

# 创建表
create table t12(name char(4));
create table t13(name varchar(4));

# 插入数据
insert into t12 values('a');
insert into t13 values('a');
# 输出结果
mysql> select * from t12;
+------+
| name |
+------+
| a    |
+------+

mysql> select * from t13;
+------+
| name |
+------+
| a    |
+------+
insert into t12 values('chosen');
insert into t13 values('chosen');
# 输出结果
mysql> insert into t12 values('chosen');
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> insert into t13 values('chosen');
ERROR 1406 (22001): Data too long for column 'name' at row 1

【3】查看长度

select char_length(name) from t12;
select char_length(name) from t13;

# 输出结果
mysql> select char_length(name) from t12;
+-------------------+
| char_length(name) |
+-------------------+
|                 1 |
+-------------------+

mysql> select char_length(name) from t13;
+-------------------+
| char_length(name) |
+-------------------+
|                 1 |
+-------------------+

【4】解决方法:取消默认去除空格

-- 修改 sql_mode 让MySQL不做自动剔除操作
-- 在修改严格模式的时候去除或者增加单个 带上原来的
-- 覆盖掉

# 查看命令
show variables like "%mode";

# 输出结果
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • 加一个严格模式PAD_CHAR_TO_FULL_LENGTH
# 修改命令
# 要在原有的基础上进行替换,所以要带有原有的属性
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH';

# 再次运行查询命令
select char_length(name) from t12;
select char_length(name) from t13;

【5】总结

(1)char

  • 缺点:浪费空间
  • 优点:存储简单
    • 直接按照固定的字符存储数据即可

(2)varchar

  • 优点:节省空间
  • 缺点:存储麻烦
    • 存的时候,在真正数据的前面加报头(表示数据真正大小)
    • 取的时候,需要先读取报头,才能读取真实的数据

以前用 char 现在 varchar 使用较多

【八】字段类型之日期时间类型

【1】日期时间类型

date : 年月日

datetime : 年月日时分秒

time : 时分秒

year : 年份

【2】示例

# 创建表
create table student(
	id int,
    name varchar(16),
    born_year year,
    birth date,
    study_time time,
    reg_time datetime
);

# 插入数据
insert into student values(
    1,
    "chosen",
    '2024',
    '2024-5-28',
    '17:45:00',
    '2024-5-10 17:47:00'   
);

# 输出结果
mysql> select * from student;
+------+--------+-----------+------------+------------+---------------------+
| id   | name   | born_year | birth      | study_time | reg_time            |
+------+--------+-----------+------------+------------+---------------------+
|    1 | chosen |      2024 | 2024-05-28 | 17:45:00   | 2024-05-10 17:47:00 |
+------+--------+-----------+------------+------------+---------------------+

【九】字段类型之枚举和集合类型

【1】枚举和集合

(1)枚举(enum):多选一

  • 枚举类型存储数据只能从候选项中选取一个才行

(2)集合(set):多选多

【2】枚举类型(enum)

# 创建表
create table user(
	id int,
    name char(16),
    gender enum('male','female','others')
);

# 插入数据
insert into user(id,name,gender) values(1,'chosen','male');
insert into user values(2,'max','female');

# 由于字段 gender 有多个赋值,enum 只能多选一,所以会报错
insert into user(id,name,gender) values(3,'tom','male,female');

# 查询表数据
select * from user;

#输出结果
mysql> select * from user;
+------+------------------+--------+
| id   | name             | gender |
+------+------------------+--------+
|    1 | chosen           | male   |
|    2 | max              | female |
+------+------------------+--------+

【3】集合类型(set)

# 创建表
create table teacher(
	id int,
    name varchar(16),
    gender enum('male','female','others'),
    hobby set('read books','play games','play sports','listen muisc')
);

# 插入数据
insert into teacher(id,name,gender,hobby) values(
	1,
    'chosen',
    'male',
    'read books,play games'
);
insert into teacher(id,name,gender,hobby) values(
	1,
    'max',
    'female',
    'listen muisc'
);

# 查询表数据
select * from teacher;

#输出结果
mysql> select * from teacher;
+------+--------+--------+-----------------------+
| id   | name   | gender | hobby                 |
+------+--------+--------+-----------------------+
|    1 | chosen | male   | read books,play games |
|    1 | max    | female | listen muisc          |
+------+--------+--------+-----------------------+

【十】总结

【1】字段类型

-- 【一】数字类型
-- 【1】整数类型
-- tinyint int bigint ...
-- 【2】浮点数类型
-- float double decimal
-- 【二】字符串类型
-- 开启严格模式
-- char  自动补全长度
-- varchar 不会自动补全
-- 【三】时间日期类型
-- date 日期 年月日
-- time 时间 时分秒
-- datetime 年月日时分秒
-- year 年份
-- 【四】枚举和集合
-- 枚举 enum 在多个备选项中只能选一个 
-- 集合 set 在多个备选项中能选多个 多个之间用,合开

【2】约束条件

-- unsigned 无符号
-- null可以为空
-- not null 不能为空
-- zerofill 默认长度用0填充

-- ● unsigned约束条件用于指定某个字段只能包含非负数(正整数或零)。
-- ● 当将字段定义为unsigned时,它会限制该字段的取值范围为大于等于零的整数。

【3】严格模式

-- 【一】查看所有的严格模式 
show variables like "%mode";
-- % 模糊查询任意长度
-- _ 模糊查询一个长度

-- 【二】修改严格模式
-- 【1】全局永久性修改
set global sql_mode = "";
-- 【2】局部临时性修改
set session sql_mode = "";

标签:name,--,浮点,枚举,values,整型,id,select,mode
From: https://www.cnblogs.com/chosen-yn/p/18233795

相关文章

  • 基本数据类型(整形,浮点型,字符串)
    数据类型(8)int123,456float2.3strstrs='ssssss'#大小写#转小写print(strs.lower())#转大写print(strs.upper())#首字母大写print(strs.title())#大小写互转字符串替换print(strs.replace('world','Tom'))字符串拆分print(strs.split('......
  • js知识点之浮点数精度问题
    浮点数精度问题浮点数精度常见问题在JavaScript中整数和浮点数都属于number数据类型,所有数字都是以64位浮点数形式储存,即便整数也是如此。所以我们在打印1.00这样的浮点数的结果是1而非1.00。在一些特殊的数值表示中,例如金额,这样看上去有点别扭,但是至少值是......
  • java中的枚举
    目录定义使用枚举与switch所有枚举类都是Enum的子类枚举类的构造器枚举类可以有成员枚举类可以有抽象方法每个枚举类都有两个特殊的方法定义一个类有多个实例,但是实例的个数不是无穷的,是有限的。枚举类中的实例称为枚举项,一般来说,一个枚举类不应该有太多的枚举项。使用public......
  • 浮点数二分查找的实现
            这是C++算法基础-基础算法专栏的第六篇文章,专栏详情请见此处。引入    上次我们学习了整数二分查找的实现,这次我们要学习浮点数二分查找的实现。定义        浮点数二分查找与整数二分查找的定义都是大致相同的,如果想了解具体内容,可以移......
  • 【IC验证】一文速通多通道数据整型器(MCDF)
    目录01README02MCDF设计结构2.1功能描述2.2设计结构2.3接口与时序2.3.1系统信号接口2.3.2通道从端接口2.3.3整形器接口2.3.4控制寄存器接口2.3.4.1接口时序图2.3.4.2各数据位信息03验证框图3.1reg_pkg3.1.1reg_trans3.1.2reg_driver3.1.3reg_......
  • C语言第2.2关 整型常量
    第1关:两个100年任务描述:中共十八大报告提出“两个一百年”奋斗目标:第一个一百年,是到中国共产党成立100年时(2021年)全面建成小康社会;第二个一百年,是到新中国成立100年时(2049年)建成富强、民主、文明、和谐、美丽的社会主义现代化强国。“两个一百年”奋斗目标,与中国梦一起,成......
  • 在 C# 中实现枚举的最佳使用
    一.介绍在C#编程语言中,枚举(enumeration)的缩写,是一种独特的数据类型,由一组命名常量(称为枚举器)组成。枚举用于建立一系列相互关联的整数常量,通过为这些常量分配描述性名称来增强代码的可读性和可管理性。二.C#中的枚举具有许多优点1.增强可读性和可维护性:枚举允许使用......
  • 通过指针变量访问整型变量
    有两个与指针变量有关的运算符:(1)&:取地址运算符。(2)*:指针运算符(或称间接访问运算符)。例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。编写程序:运行结果:程序分析:        (1)在程序第5行虽然定义了两个指针变量pointer_1和pointer_2,但它们并未指向任何一个......
  • (nice!!!)LeetCode 2928. 给小朋友们分糖果 I(枚举、容斥原理)
    2928.给小朋友们分糖果I思路:方法一,三层for循环直接暴力枚举,时间复杂度0(n^3)classSolution{public:intdistributeCandies(intn,intlimit){intans=0;for(inti=0;i<=n&&i<=limit;i++){for(intj=0;j<=n&&j<=limit;j++){......
  • 信息学奥赛初赛天天练-17-阅读理解-浮点数精准输出与海伦公式的巧妙应用
    PDF文档公众号回复关键字:2024053112023CSP-J阅读程序1阅读程序(程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)源代码#include<iostream>#include<cmath>usingnamespacestd;doublef(doublea,double......