MySQL - 存储引擎|约束条件|数据类型

上一篇: 初识MySQL(如果需要复习或者没学过MySQL的话可以过一下)

存储引擎

不同的文件格式对应不同的存储方式和处理机制[如 txt, pdf, docx, mp4…]
存储引擎 --> 不同的存储机制

MySQL主要存储引擎

Innodb: MySQL5.5版本及之后的默认存储引擎; 存储数据更安全


Myisam: MySQL5.5版本之前的默认存储引擎;存储数据比Innodb更快

[我们更注重的是数据安全]


Memory: 内存引擎, 数据全部存放在内存中, 断电数据丢失

Blackhole: 无论存什么, 都立刻消失

mysql>show engines;


+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

主要存储引擎的区别[图示]

# 建库
create database day45;

# 用库
use day45;


# 以不同的引擎建表
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;


# 随便插入一条数据
insert into t1 values(1);

insert into t2 values(1);

insert into t3 values(1);

insert into t4 values(1);

创建表的完整语法

create table 表名(
    字段名1 类型(宽度) 约束条件,
    字段名2 类型(宽度) 约束条件,
    字段名3 类型(宽度) 约束条件
)

注意

  1. 在同一张表中字段名不能重复
  2. 宽度和约束条件(在宽度的基础上增加额外的约束)是可选的
  3. 字段名和字段类型是必须的
  4. 约束条件支持写多个: 字段名1 类型(宽度) 约束条件1 约束条件2...,
  5. 最后一行不能有逗号
create table t5(
            id    # 不写字段类型, 报错
        );



create table t6(
            id int,
            name char,  # 最后一行有逗号, 报错
        );

 补充

  1. 宽度: 一般情况下, 是对存储数据的限制
  2. 严格模式: 不满足限制条件则报错[不同版本不同效果]

  严格模式

如何查看严格模式 --> 模糊匹配

模糊匹配
    关键字 like
        % :  匹配任意多个字符
        _ :   匹配任意单个字符

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

session|global使用

# "5.6及以下版本", 修改为严格模式


# 只在当前窗口有效
set session xxx=xxxx;


# 全局有效
set global xxx=xxxx;  
set global sql_mode = 'STRICT_TRANS_TABLES';  # 这个修改完之后 重新进入服务端即可

严格模式到底开不开?


MySQL5.7及之后的版本默认都是开启严格模式的[我的是5.7]


使用数据库的准则:
    能尽量少的让数据库干活就尽量少 不要给数据库增加额外的压力

开了比较好, 如果不开, 数据库还要帮着截取数据, 多干活儿

# 宽度
create table t7(name char);  # char默认宽度是1

insert into t7 values('matrix');

insert into t7 values(null);  # 关键字NULL


# 针对不同的版本会出现不同的效果

# 5.6版本默认没有开启严格模式
        规定只能存一个字符你给了多个字符,会被自动截取, 不报错

# 5.7版本及以上或者开启了严格模式
        规定只能存几个, 不能超,一旦超出范围立刻报错
        ERROR 1406 (22001): Data too long for ...
# 约束条件  not null  不能插入null
create table t8(id int,name char not null);


mysql> insert into t8 values(1, 'a');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t8 values(2, null);
ERROR 1048 (23000): Column 'name' cannot be null

约束条件

zerofill        用零填充

unsigned    无符号

not null        非空

基本数据类型

整型

  • 分类

    最小整型 小整型 中等整型 整型 大整型

    TINYINT SMALLINT MEDUIMINT INT BIGINT

  • 作用

    存储年龄、等级、id、号码等等

数据类型字节数带符号最小值带符号最大值不带符号最小值不带符号最大值
TINYINT1-1281270255
SMALLINT2-3276832767065535
MEDIUMINT3-83886088388607016777215
INT4-2147483648214748364704294967295
BIGINT8-92233720368547758089223372036854775807018446744073709551616

浮点型

  • 分类

    FLOAT、DOUBLE、DECIMAL

  • 作用

    身高、体重、薪资

# 存储限制, 开足够长的小数位, 显示出来, 后边比较精确度
float(255,30)  # 总共255位 小数部分占30位
double(255,30)  # 总共255位 小数部分占30位
decimal(65,30)  # 总共65位 小数部分占30位

# 精确度验证
create table t15(id float(255,30));
create table t16(id double(255,30));
create table t17(id decimal(65,30));

insert into t15 values(1.111111111111111111111111111111);
insert into t16 values(1.111111111111111111111111111111);
insert into t17 values(1.111111111111111111111111111111);

# 插入数据实验
mysql> insert into t15 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t16 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t17 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t15;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.01 sec)

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

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

精确度比较结果: float < double < decimal


要结合实际应用场景 三者都能使用

 好长, 不想写了, 再开一篇吧

下一篇: 字符类型, 时间类型, 枚举与集合类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值