MySQL存储引擎

什么是存储引擎?

数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。用于根据不同的机制处理不同的数据

提示:InnoDB 事务型数据库的首选引擎,支持事务安全表(ACID),行锁定 和 外键。( 事务主要用于处理操作量大,复杂度高的数据)

MySQL 5.5.5 之后,InnoDB 作为默认存储引擎。

查看MySQL中所有引擎

show engines

create table t1(id int)engines=innodb;  #创建引擎为innodb的表

myisam:5.5以前老的版本使用的存储引擎,拥有较高的插入,查询速度,但不支持事物

blackhole:类似于队列中的数据,存进去消失

memory:通电数据存在,断电丢失

创建表完整的语法

约束条件:可有可无

宽度:限制某些数据类型的存储大小

非空约束

在创建表时可以用NOT NULL关键字设置非空约束

<字段名><数据类型> NOT NULL

实例:

mysql> create table t6(
    id int not null
);
Query OK, 0 rows affected (0.25 sec)

mysql> desc t6;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

字段类型

整形类型INT TINYINT

SMALLINT MEDIUMINT BIGINT

整形类型又称数值型数据,主要用来存储数字。

类型名称 说明 存储需求
TINYINT 很小的整数 1个字节
SMALLINT 小的整数 2个宇节
MEDIUMINT 中等大小的整数 3个字节
INT (INTEGHR) 普通大小的整数 4个字节
BIGINT 大整数 8个字节

从上表中可以看到,不同类型的整数存储所需的字节数不相同,占用字节数最小的是 TINYINT 类型,占用字节最大的是 BIGINT 类型,占用的字节越多的类型所能表示的数值范围越大。

类型名称 说明 存储需求
TINYINT -128〜127 0 〜255
SMALLINT -32768〜32767 0〜65535
MEDIUMINT -8388608〜8388607 0〜16777215
INT (INTEGER) -2147483648〜2147483647 0〜4294967295
BIGINT -9223372036854775808〜9223372036854775807 0〜18446744073709551615

实例:tinyint 范围 -128〜127

create table t7(
    id tinyint
);

实例:int 范围 -2147483648〜2147483647

create table t8(
    id int
);

若插入超过设定宽度,则正常显示

若插入不足,则以空格不全

浮点类型float

DOUBLE 双精度浮点数

DECIMAL 压缩的“严格”定点数

三种浮点型的区别在于 精确到不一样

应用场景:工资,身高,体重。。。

实例:

create table t9(sal float(255,30))  #范围255是最大长度(包括.小数),30代表的是小数的位数

字符类型char varchar

类型名称 说明 存储需求
CHAR(M) 固定长度非二进制字符串 M 字节,1<=M<=255
VARCHAR(M) 变长非二进制字符串 L+1字节,在此,L< = M和 1<=M<=255
TINYTEXT 非常小的非二进制字符串 L+1字节,在此,L<2^8
TEXT 小的非二进制字符串 L+2字节,在此,L<2^16
MEDIUMTEXT 中等大小的非二进制字符串 L+3字节,在此,L<2^24
LONGTEXT 大的非二进制字符串 L+4字节,在此,L<2^32
ENUM 枚举类型,只能有一个枚举字符串值 1或2个字节,取决于枚举值的数目 (最大值为65535)
SET 一个设置,字符串对象可以有零个或 多个SET成员 1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)

CHAR(M) 为固定长度字符串,应用场景:手机号,身份证,银行卡号。。。

长度范围是 0~255. 当你想要储存一个长度不足 255 的字符时,Mysql 会用空格来填充剩下的字符

优点:速度快

缺点:浪费空间

VARCHAR()为可变字符类型,存几个字符,就是几个字符的大小,每个字符前都要+1bytes,最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。

优点:节省空间

TEXT() 保存非二进制字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。

与 char 和 varchar 不同的是,text 不可以有默认值,其最大长度是 2 的 16 次方-1

日期类型

每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。

类型名称 日期格式 日期范围 存储需求
YEAR YYYY 1901 ~ 2155 1 个字节
TIME HH:MM:SS -838:59:59 ~ 838:59:59 3 个字节
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-3 3 个字节
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8 个字节
TIMESTAMP YYYY-MM-DD HH:MM:SS 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC 4 个字节

date:2019-12-11

datetime:2019-12-11 15:50:55

time:15:50:55

year:2019

timestamp:时间戳

时间戳实例:

mysql> insert into t11 values(1,null);
Query OK, 1 row affected (0.04 sec)

mysql> select * from t11;
+------+---------------------+
| id   | create_time         |
+------+---------------------+
|    1 | 2019-12-11 15:53:24 |
+------+---------------------+
create table student(
                id int,
                name varchar(4),
                birth date,
                register datetime,
                work_time year,
                t_time time,
                update_time timestamp
            );

python 插入时间数据时,转成str类型

枚举集合

enum:多选一

create table t12(
    id int,
    name varchar(10),
    gender enum('male','female')
);
mysql> insert into t12 values(1,'letin','male');
Query OK, 1 row affected (0.05 sec)

set:多选一 或 多选多

create table t13(
    id int,
    name varchar(10),
    hobbies set('swimming','game','study')
);
mysql> insert into t13 values(1,'letin','swimming,game,study');
Query OK, 1 row affected (0.06 sec)

mysql> select * from t13;
+------+-------+---------------------+
| id   | name  | hobbies             |
+------+-------+---------------------+
|    1 | letin | swimming,game,read |
+------+-------+---------------------+
1 row in set (0.00 sec)

约束条件

unique将某个字段设置为唯一的值

not + null + unique 变为主键

create table t14(
    id int not null unique,
    name varchar(10)
);
mysql> insert into t14 values(1,'letin');
Query OK, 1 row affected (0.05 sec)

mysql> insert into t14 values(1,'leiting');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'   #id设置了唯一,重复后会报错

主键 自增

primary key-–-–-–>not null unique

主键就是表中的索引:可以通过索引快速查找某些数据

主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则:

  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值

主键实例:

mysql> create table t15(
    -> id int primary key,
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.19 sec)

主键自增实例:primary key auto_increment

mysql> create table t16(
    -> id int primary key auto_increment,
    -> name varchar(10)
    -> );
Query OK, 0 rows affected (0.20 sec)
mysql> desc t16;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

自增默认从1开始

mysql> insert into t16(name) values('letin');
Query OK, 1 row affected (0.04 sec)

unsigned无符号

mysql> create table t17(
    -> id int unsigned
    -> );
Query OK, 0 rows affected (0.19 sec)

插入数字是不能带符号

zerofill使用0填充

mysql> create table t18(
    -> id int zerofill
    -> );
Query OK, 0 rows affected (0.22 sec)
mysql> insert into t18 values(100);
Query OK, 1 row affected (0.04 sec)

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

删除记录

delete 清空记录,id还是接着清除前的数字

mysql> delete from t18;
Query OK, 1 row affected (0.04 sec)

mysql> select * from t18;
Empty set (0.00 sec)

mysql> desc t18;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type                      | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| id    | int(10) unsigned zerofill | YES  |     | NULL    |       |
+-------+---------------------------+------+-----+---------+-------+
1 row in set (0.01 sec)

truncate清空多有记录,并且id重置为0

truncate table t20;

MySQL字段类型 约束的更多相关文章

  1. (转)MySQL字段类型详解

    MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...

  2. MySQL 字段类型介绍

    MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 M ...

  3. MySql 字段类型对应 Java 实体类型

    前言 MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的: 一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.Strin ...

  4. MySQL字段类型与操作

    MYSQL字段类型与操作 字符编码与配置文件 操作 代码 功能 查看 \s 查看数据库基本信息(用户.字符编码) 配置(配置文件层面) my-default.ini windows下MySQL默认的配 ...

  5. Java JDBC中,MySQL字段类型到JAVA类型的转换

    1. 概述 在使用Java JDBC时,你是否有过这样的疑问:MySQL里的数据类型到底该选择哪种Java类型与之对应?本篇将为你揭开这个答案. 2. 类型映射  java.sql.Types定义了常 ...

  6. Mysql字段类型与合理选择

    字段类型 数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许 ...

  7. MySql字段类型及字节

    字段类型:TINYINT-----------------一个很小的整数.有符号的范围是-128到127,无符号的范围是0到255. SMALLINT--------------一个小整数.有符号的范 ...

  8. MySQL字段类型最全解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  9. 字符编码,存储引擎,MySQL字段类型,MySQL字段约束条件

    字符编码 查看MySQL默认编码命令:\s """ 如果是5.X系列 显示的编码有多种 latin1 gbk 如果是8.X系列 显示的统一是utf8mb4 utf8mb4 ...

随机推荐

  1. telnet: Unable to connect to remote host: No route to host

    用iptables -F这个命令来关闭防火墙,但是使用这个命令前,千万记得用iptables -L查看一下你的系统中所有链的默认target,iptables -F这个命令只是清除所有规则,只不会真正 ...

  2. 配置每次git push 不需要输入账号密码

    配置每次git push 不需要输入账号密码 .gitconfig文件地址 C:\Users\Admin

  3. 使用 jQuery.AutoComplete 让文本框自动完成

    直接贴代码了. @section headSection { <script type="text/javascript"> $(document).ready(fun ...

  4. Java代码开发之《安全规约》

    安全规约 1. [强制]隶属于用户个人的页面或者功能必须进行权限控制校验.     说明:防止没有做水平权限校验就可随意访问.修改.删除别人的数据,比如查看他人的私信内容.修改 他人的订单. 2. [ ...

  5. IO多路复用(转)

    原文:Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文 ...

  6. Asp.Net或WebAPI获取表单数据流(批量文件上传)

    //Web或WebAPI获取表单数据流(批量文件上传)        public JsonResult UploadFile()        {            //HttpPostedFi ...

  7. Tp5.1开发初入门

    今天需要给金融部门那边做一个信用卡的推广页面,他们系统是用PHP的tp框架做的.我记得最早做tp还是2的时候,和现在的5.1相差太大了,中间开发的时候,还是遇到了点问题.所以,把今天的问题记录下,作个 ...

  8. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  9. 第九届极客大挑战——小帅的广告(二阶sql注入)

    也是经过一通扫描和测试,没发现其他有用信息,感觉这是个sql注入.其实对于二阶sql注入我以前没实践过,也没看过资料,只是知道这个名字,但不知道为何看到这道题就让我回想起了这个名词,所以查了一下二阶s ...

  10. 剑指offer 9-10:青蛙跳台阶与Fibonacii数列

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 问题分析 我们将跳法个数y与台阶数n视为一个函数关系,即y=f(n). ...