【2.0】数据库知识点小结数据库进阶
【一】存储引擎
- 日常生活中文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制
- 针对不同的数据应该有对应的不同的处理机制
存储引擎就是不同的处理机制
MySQL主要的存储引擎
Innodb
- 是MySQL5.5版本之后的默认存储引擎
- 支持事务/行锁/外键
myisam
- 是MySQL5.5版本之前的默认存储引擎
- 速度比innodb快,但是数据安全较弱
memory
- 内存引擎
- 数据全部存放在内存中
- 存储速度快,但是断电数据丢失
blackhole
- 黑洞引擎
- 无论存什么都会立刻消失
查看所有的数据库存储引擎
show engines;
不同的存储引擎存储数据的异同点
创建表
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=blackhole;
create table t4(id int) engine=memory;
- t1.frm
- 表结构
- t1.ibd
- 表结构
Innodb:默认的引擎
- t2.frm
- 表结构
- t2.MYD
- 表数据
- t2.MYI
- 索引(index),类似于书的目录,基于目录查找数据的速度会很快
myisam:数据具有索引,读取数据快
- t3.frm
- 表结构
blackhole:黑洞引擎,存什么数据都会消失
- t4.frm
- 表结构
memory:数据缓存到内存
存储数据
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
查看数据
select * from t1;
select * from t2;
select * from t3;
select * from t4;
- 可以发现除了黑洞引擎,其他引擎所在的表内都存在数据
- memory 数据是存在内存中的,如何印证?
- 重启mysql服务
- memory 数据是存在内存中的,如何印证?
- 可以发现memory 表中的数据已经不存在了
【二】创建表的完整语法
【一】完整语法
create table 表明(
字段名1 类型(宽度) 约束条件,
字段名2 类型(宽度) 约束条件,
字段名3 类型(宽度) 约束条件,
)
同一张表中字段名不能重复
宽度和约束条件是可选的(可写可不写)
- 约束条件可以写多个
字段名和字段类型是必须的
create table t5(id);
# ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
- 需要加字段类型
create table t5(id int);
# Query OK, 0 rows affected (0.64 sec)
# 查看表的详细信息
desc t5;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
-
最后一行不能加逗号
create table t6( id int, name char, ); # ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 4
- 删除 逗号
create table t6( id int, name char ); # Query OK, 0 rows affected (0.77 sec)
- 查看表的详细信息
desc t6;
+-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
【二】补充
【1】宽度:
- 一般情况下指的是对存储数据的限制
- 默认宽度为 1(只能存一个字符)
- 创建表
create table t7(name char);
# Query OK, 0 rows affected (0.58 sec)
- 查看表的详细信息
desc t7;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 默认宽度为 1(只能存一个字符)
指定数据长度插入数据
insert t7 values('dream');
# ERROR 1406 (22001): Data too long for column 'name' at row 1
- 5.6 版本默认没有开启严格模式,规定只能存一个字符,给多了字符就会自动截取一个字符
- 5.7 版本及以上开启了严格模式,那么规定存几个就只能存几个,不能超出,一旦超出就会报上面的错误
数据插入的数null
- 插入数据
insert t7 values(null);
# Query OK, 1 row affected (0.11 sec)
- 查看数据
desc t7;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 默认允许插入 空
【2】约束条件 null / not null
- 创建表
create table t8(id int,name char not null);
# Query OK, 0 rows affected (0.55 sec)
- 查看数据
desc t8;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(1) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
name字段的 null 是 No 不能为空
- 插入数据
insert t8 values(1,'dream');
# ERROR 1406 (22001): Data too long for column 'name' at row 1
尴尬 name 没加限制 太短了
- 再次插入数据(长度为 1 )
insert t8 values(1,'d');
# Query OK, 1 row affected (0.20 sec)
- 查看数据
desc t8;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(1) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
- 再次插入数据长度为空
insert t8 values(2,null);
# ERROR 1048 (23000): Column 'name' cannot be null
限制了name字段不能为空
【3】宽度和约束条件之间的联系
- 宽度是用来限制数据的存储
- 约束条件是在宽度的基础上增加的额外的约束
【4】严格模式到底开启还是不开启
- 5.7 之后的版本默认都是开启严格模式的
- 尽量减轻数据库的负担,不给数据库增加额外的压力
【三】基本数据类型
【1】整型
整型默认情况下都是带有符号的
针对整型()内的符号到底是什么用?
针对整型,括号内的宽度是用来限制存储数据的范围的
特例:
只有整型括号内的数字不是表示限制位数而是显示长度
-
分类
TINYINT SAMLLINT MEDUIMINT INT BINGINT
-
作用
- 存储年龄、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存储数据超出最大范围会如何
- 创建表
create table t9(id tinyint);
# Query OK, 0 rows affected (0.58 sec)
- 查看表
desc t9;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
表中已经有了相应的数据格式
TINYINT 有符号最大限制 -128~127
- 插入数据
insert into t9 values(-129),(256);
# ERROR 1264 (22003): Out of range value for column 'id' at row 1
- 插入数据
insert into t9 values(-128),(127);
# Query OK, 2 rows affected (0.15 sec)
Records: 2 Duplicates: 0 Warnings: 0
- 查看表
select * from t9;
+------+
| id |
+------+
| -128 |
| 127 |
+------+
2 rows in set (0.00 sec)
- 默认情况下是带符号的
- 超出限制只能存最大接受值
(2)约束条件之unsigned(无符号)
- 创建表(约束条件:
tinyint unsigned
)
create table t10(id tinyint unsigned);
# Query OK, 0 rows affected (1.00 sec)
- 查看表
desc t10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id | tinyint(3) unsigned | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 插入数据
insert into t10 values(156);
# Query OK, 1 row affected (0.12 sec)
- 查看数据
select * from t10;
+------+
| id |
+------+
| 128 |
| 156 |
+------+
2 rows in set (0.00 sec)
针对整型()内的符号到底是什么用?
针对整型,括号内的宽度是用来限制存储数据的范围的
- 创建表
create table t12(id int(8));
# Query OK, 0 rows affected (0.76 sec)
- 查看表
desc t12;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id | int(8) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 插入数据
insert into t12 values(123456789);
# Query OK, 1 row affected (0.09 sec)
- 查看表
select * from t12;
+-----------+
| id |
+-----------+
| 123456789 |
+-----------+
1 row in set (0.00 sec)
限制了 8 存储了 9 位
特例:
只有整型括号内的数字不是表示限制位数而是显示长度
id int(8)
如果数字没有超出 8 位 ,那么默认用 0 填充至 8 位
如果数字超出 8 位 ,那么 有几位存几位(但是还是要遵循最大范围)
- 插入数据
insert into t12 values(1);
# Query OK, 1 row affected (0.25 sec)
- 查看表
select * from t12;
+-----------+
| id |
+-----------+
| 123456789 |
| 1 |
+-----------+
2 rows in set (0.00 sec)
按理来说是应该用 0 填充的,但是为什么看不见 0 呢?
(1)约束条件之 zerofill
- 创建表(无符号,用 0 填充至 8 位)
create table t13(id int(8) unsigned zerofill);
# Query OK, 0 rows affected (0.57 sec)
- 查看表
desc t13;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id | int(8) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 插入数据
insert into t13 values(1);
# Query OK, 1 row affected (0.20 sec)
insert into t13 values(123456789);
# Query OK, 1 row affected (0.20 sec)
- 查看表
select * from t13;
+-----------+
| id |
+-----------+
| 00000001 |
| 123456789 |
+-----------+
2 rows in set (0.00 sec)
数字不够 8 位 用 0 填充
总结
- 针对整型字段,无需指定宽度,因为它默认的宽度已经足够展示所有数据了
【2】严格模式
(1)如何查看严格模式
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)
sql_mode(严格模式):
(2)模糊匹配/查询like "%mode"
关键字 : like
%
- 匹配任意多个字符
_
- 只能匹配单个字符
(3)修改严格模式
只在当前窗口有效
set session;
全局有效
set global
- 语法(严格模式)
set glabal sql_mode = 'STRICT_TRANS_TABLES'
修改完成后,重启服务端,即可生效
【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)存储限制
float(255,30)
# 总共255位 , 小数部分占 30 位
double(255,30)
# 总共255位 , 小数部分占 30 位
decimal(65,30)
# 总共65位 , 小数部分占 30 位
(2)精确度验证
- 创建表
create table t15(id float(255,30));
create table t16(id double(255,30));
create table t17(id decimal(65,30));
# Query OK, 0 rows affected (1.67 sec)
# Query OK, 0 rows affected (0.93 sec)
# Query OK, 0 rows affected (2.60 sec)
- 查看表
desc t15;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | float(255,30) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.00 sec)
desc t16;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id | double(255,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
desc t17;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id | decimal(65,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 插入数据
insert into t15 values(1.1111111111111111111111);
insert into t16 values(1.1111111111111111111111);
insert into t17 values(1.1111111111111111111111);
# Query OK, 1 row affected (0.17 sec)
# Query OK, 1 row affected (0.12 sec)
# Query OK, 1 row affected (0.19 sec)
- 查看数据
select * from t15;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
select * from t16;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
select * from t17;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111111111100000000 |
+----------------------------------+
1 row in set (0.00 sec)
可以很明显的发现每一个类型的精确度有明显的区别
float < double < decimal
虽然每个类型的精确度不一,但是可以根据实际情况选择对应的数据类型
【4】字符类型
-
分类
-
CHAR
- 定长
char(4) #(超过四个字符直接报错,不够,四个字符空格补全)
-
VARCHAR
- 变长
varchar(4) #(超过四个字符直接报错,不够,有几个接存几个)
-
(1)char 与 varchar 的比较
- 创建表
create table t18(name char(4));
create table t19(name varchar(4));
# Query OK, 0 rows affected (1.05 sec)
# Query OK, 0 rows affected (0.54 sec)
- 查看表
desc t18;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name | char(4) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
desc t19;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
- 插入数据
insert into t18 values('a');
insert into t19 values('a');
# Query OK, 1 row affected (0.11 sec)
# Query OK, 1 row affected (0.12 sec)
- 插入数据(超出字符范围)
insert into t18 values('dream');
# ERROR 1406 (22001): Data too long for column 'name' at row 1
- 查看表
select * from t18;
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
select * from t19;
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
我们可以观察到,通过这种方式无法直观地看到我们想要的效果
(2)补充 char_length
char_length
:统计字段长度
select char_length(name) from t18;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
select char_length(name) from t19;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
- char 在硬盘上存的绝对是真正的数据,带有空格
- 但是在现实的时候MySQL会自动将多余的空格删除
(3)解决办法 - 取消方法
再次修改 sql_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.01 sec)
- 修改命令
要在原有的基础上进行替换,所以要带有原有的属性
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';
# Query OK, 0 rows affected (0.00 sec)
- 再次运行查询命令
select char_length(name) from t18;
+-------------------+
| char_length(name) |
+-------------------+
| 4 |
+-------------------+
1 row in set (0.00 sec)
select char_length(name) from t19;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
- char 在硬盘上存的绝对是真正的数据,带有空格
- 但是在现实的时候MySQL会自动将多余的空格删除
(4)char
与 varchar
的比较
- char
- 缺点:浪费空间
- 优点:存储简单
- 直接按照固定的字符存储数据即可
- varchar
- 优点:节省空间
- 缺点:存储麻烦
- 存的时候,在真正数据的前面加报头(表示数据真正大小)
- 取的时候,需要先读取报头,才能读取真实的数据
以前用 char 现在 varchar 使用较多
【5】时间类型
-
分类
- date
- 年月日
- datetime
- 年月日时分秒
- time
- 时分秒
- year
- 年
- date
-
创建表
create table student(
id int,
name varchar(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
# Query OK, 0 rows affected (0.45 sec)
- 插入数据
insert into student values(
1,
'dream',
'2001',
'2001-1-31',
'11:11:11',
'2023-6-30 11:11:11'
);
# Query OK, 1 row affected (0.09 sec)
- 查看表
desc student;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(16) | YES | | NULL | |
| born_year | year(4) | YES | | NULL | |
| birth | date | YES | | NULL | |
| study_time | time | YES | | NULL | |
| reg_time | datetime | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 查看表数据
select * from student;
+------+-------+-----------+------------+------------+---------------------+
| id | name | born_year | birth | study_time | reg_time |
+------+-------+-----------+------------+------------+---------------------+
| 1 | dream | 2001 | 2001-01-31 | 11:11:11 | 2023-06-30 11:11:11 |
+------+-------+-----------+------------+------------+---------------------+
1 row in set (0.00 sec)
【6】枚举与集合类型
(1)枚举与集合
枚举(enum):多选一
枚举类型存储数据只能从候选项中选取一个才行
集合(set):多选多
(2)使用
枚举
- 创建表
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
# Query OK, 0 rows affected (1.13 sec)
- 查看表
desc user;
+--------+--------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(16) | YES | | NULL | |
| gender | enum('male','female','others') | YES | | NULL | |
+--------+--------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 插入数据
insert into user values(1,'dream','male');
# Query OK, 1 row affected (0.17 sec)
- 查看表数据
select * from user;
+------+------------------+--------+
| id | name | gender |
+------+------------------+--------+
| 1 | dream | male |
+------+------------------+--------+
1 row in set (0.00 sec)
正常插入
- 插入数据
insert into user values(2,'chimeng','x');
# ERROR 1265 (01000): Data truncated for column 'gender' at row 1
枚举类型存储数据只能从候选项中选取一个才行
集合
- 创建表
create table teacher(
id int,
name varchar(16),
gender enum('male','female','others'),
hobby set('read books','listen music','play games')
);
# Query OK, 0 rows affected (0.58 sec)
- 查看表
desc teacher;
+--------+-----------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(16) | YES | | NULL | |
| gender | enum('male','female','others') | YES | | NULL | |
| hobby | set('read books','listen music','play games') | YES | | NULL | |
+--------+-----------------------------------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
- 插入数据
insert into teacher values(
1,
'dream',
'male',
'read books'
);
# Query OK, 1 row affected (0.17 sec)
- 查看数据
select * from teacher;
+------+-------+--------+------------+
| id | name | gender | hobby |
+------+-------+--------+------------+
| 1 | dream | male | read books |
+------+-------+--------+------------+
1 row in set (0.00 sec)
- 插入数据
insert into teacher values(
2,
'chimeng',
'female',
'read books,listen music'
);
# Query OK, 1 row affected (0.17 sec)
- 查看数据
+------+---------+--------+-------------------------+
| id | name | gender | hobby |
+------+---------+--------+-------------------------+
| 1 | dream | male | read books |
| 2 | chimeng | female | read books,listen music |
+------+---------+--------+-------------------------+
2 rows in set (0.00 sec)
- 插入数据
insert into teacher values(
3,
'bud',
'others'
);
# ERROR 1136 (21S01): Column count doesn't match value count at row 1
集合类型
可以多选
不允许不选,错选
【四】小结
【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
时,它会限制该字段的取值范围为大于等于零的整数。 - 这对于表示计数器、年龄、数量等非负数值的字段非常有用。