5
数据库
昨日内容回顾
# 【一】数据存储的演变过程
# 【1】存储方式是基于内存存储 ----> 断电消失不能持久化存储
# 【2】基于文件存储 ---> 基于文本文件存储 (不方便管理和展示) ---> 基于json文件存储数据 ---> 将数据组织成指定的格式
# 【3】学了软件开发规范 ---> 对每一个文件夹进行了功能的划分 ---> 存储数据的目录是 db(database) ---> data ---> 存储文件
# 【4】基于TCP的客户端和服务端开发一个自己的远程服务存储和下载服务端 ---> 在服务端存储数据 书写指令 , 在客户端向服务端发送指令下载或上传数据
# 【二】数据库
# 数据库其实就是一个远程存储和组织数据的服务端#3
# 因为存储数据可以存储在内存中或者存储在文件中(持久化和临时存储) ---> 两大类数据库
# 【1】关系型数据库
# 持久存储数据
# 数据能持久化存储到本地
# 利用表关系来组织相应的数据
# 丰富的查询和修改方式(语句)
# MySQL、Oracle、postgresql ...
# 【2】非关系型数据库
# 能临时存储数据的数据库
# 数据是临时存储在内存中
# 利用 K:V 键值对来存储数据
# 只能进行简单的增删查该无法兼容更复杂的操作
# Redis、MongoDB ...
# 【3】数据库的应用场景
# 就是为了更加方便的存储数据
# 实现团队对数据的共享和操作
# 【三】SQL语句的由来
# 【1】SQL语句的诞生
# 既然数据库就是客户端和服务端的关系
# 操作服务端就需要执行指定的命令
# 因为一开始大家都没有意识,谁操作谁就开发一门语言区操作他(高度自定制) # A select B search C check
# 于是为了统一约束操作数据库的语法和命令就诞生了一门语言 : SQL
# 【2】SQL语句的操作分类
# (1)数据定义语言 ddl
# 创建 create
# 删除 drop
# 修改 alter
# (2)数据操纵语言 dml
# 查询 select
# 插入 insert
# 更新 update
# 删除 delete
# (3)数据控制语言 dcl
# 确认 commit
# 回滚 rollback
# 赋予操作权限 grant
# 取消操作权限 remove
# 【3】几个重要的概念
# 库 database 存储和组织数据的容器 相当于文件夹
# 表 table 存储数据和组织数据的载体 相当于文件
# 表头 header 整张表的表头字段 相当于表头字段
# 记录 record 一条条的数据 相当于数据
# 表单 form 字段标题+数据 相当于文件中的表头+一行行的数据
# 【五】MySQL的安装和注意事项
# 【1】安装
# 访问MySQL官网 --> 点击download --> MySQL Community (GPL) Downloads » ---> MySQL Community Server --> 选择版本和系统
# 【2】安装
# 下载完成以后会看到一个压缩包
# 将压缩包解压 ---> 可以对文件夹名名字进行重命名(看着不舒服) ---> 和Python解释器一样命名带版本
# 创建一个 my.ini 文件 ----> 增加配置 (直接复制) ---> 记得更改掉里面的数据目录 datadir 安装目录
# 创建一个data文件夹
# 【3】初始化
# 记得将MySQL安装目录的bin目录添加到环境变量中 ---> 为了在任意位置都能找到MySQL的客户端 ---> 不加就在MySQL的bin目录下启动 客户端或服务端
# mysqld --initialize --console ---> 得到一串临时密码 0---> 记住
# 注册系统服务 mysqld --install ---> 你会看到自己的服务列表中增加了一个 MySQL服务
# 注销系统服务 mysqld --remove ---> 系统服务删除
# 启动MySQL服务 net start mysql
# 停止MySQL服务 net stop mysql
# 【4】登入MySQL
# 方式一: mysql -uroot -p ---> enter 输入密码 登入
# 方式二:mysql -h 127.0.0.1 -P 3306 -uroot -p 以指定IP和端口登入
# 方式三:mysql -uroot -p123456
# 【5】登入进去以后 --> 修改密码
# 修改密码
# alter user 'root'@'localhost' identified by '123456';
# 刷新权限
# flush privileges;
# 如果忘记密码如何修改密码?
# 首先要停止MySQL服务 net stop mysql
# 启动一个调表后的MySQL服务 mysqld --skip-grant-tables ---> 程序卡主
# 重新启动一个终端 输入 mysql -uroot -p 直接回车
# 先刷新权限 flush privileges;
# 在修改密码 alter user 'root'@'localhost' identified by '123456';
# 不要忘了在刷新权限 flush privileges;
# 退出服务
# 再启动MySQL服务
# 【6】退出客户端
# quit / exit
# 【七】SQL基础操作语法
# 每一句SQL语句的结尾必须有分隔符 , 没有分隔符默认是一句话
# SQL语句可以换行并且不会指定
# 【1】操作数据库 database
# (1)创建数据库
# create database 数据库名字;
# 创建出来的编码格式继承自配置文件中的编码格式
# 查看自己数据库的编码格式 lanten1 ---> 不兼容中文
# (2)查看所有数据库
# show databases;
# (3)删除数据库
# drop database 数据库名字;
# 【2】操作数据表 table
# 每一个字段之间用英文的逗号隔开 , 但是最后一个字段不允许放逗号
# 字段名和字段类型必须有,字段长度和约束条件非必须,因为有的字段默认自带长度
# (0)操作表必须先切换库
# use 数据库名字;
# (1)创建表
# create table 表名(字段名 字段类型(长度) 约束条件, 字段名 字段类型(长度) 约束条件);
# (2)查询表
# 查询当前所在库
# select database();
# 查看当前表的所有字段信息
# describe 表名;
# desc 表名;
# 为了更加好看 格式化输出
# desc 表名\G;
# 查看当前表的建表语句
# show create table 表名;
# 在输出的内容里面还会有当前表的存储引擎以及编码格式
# (3)修改表
# 修改表的字段或者字段类型
# alter table 表名 modify 字段名 字段类型(宽度); # 只能需改类型不能修改名字
# alter table 表名 change 字段名 字段类型(宽度); # 只能需改类型不能修改名字
# 修改表的名字
# alter table 表名 rename 表名 ;
# 追加字段
# 直接追加在末尾
# alter table 表名 add 字段名 字段类型;
# 追加到指定字段名末尾
# alter table 表名 add 字段名 字段类型 after 字段名;
# 追加到所有字段头部
# alter table 表名 add 字段名 字段类型 first;
# (4)删除指定字段
# alter table 表名 drop 字段名;
# 【3】操作数据 record
# (1)查看数据
# 当前表下的所有数据
# select * from 表名;
# 根据过滤条件筛选数据
# select * from 表名 where 字段名=字段值;
# (2)相表中插入数据
# insert into 表名(字段名) values(字段值); # 可以不按照位置传 , 但是要和前面的字典名对应上
# insert into 表名 values(字段值); # 一定要和表中的字段的位置对应上
# (3)修改数据
# update 表名 set 字段名=新值 where 字段名=字段值;
# (4)删除数据
# delete from 表名 where 字段名=字段值; # 按照指定的过滤条件删除数据 , 注意会删除掉所有符合条件的数据
# delete from 表名; # 相当于清空当前数据表中的所有数据
# 【4】提醒
# 不要轻易的使用 drop , 因为删除掉数据库或者数据表 ---> 无法找回
今日内容
【一】储存引擎
#【一】MySQL的四种储存引擎
#【1】 Innodb
# 默认存储引擎 5.5版本之后都用这个
#【2】myisam
# 是5.5版本之前的默认储存引擎
# 速度比 Innodb快,但是数据安全性较弱
#【3】memory
# 内存引擎
# 数据全部都存储再内存当中,一旦重启那么数据就会丢失
#【4】blackhole
# 黑洞引擎
# 往里面存储的任何数据都会被清空
#【二】如何查看所有的引擎:
# show engines;
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.10 sec)
【1】建表语句
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| day001 |
| day01 |
| day02 |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
9 rows in set (0.00 sec)
mysql> use day02;
Database changed
mysql> create table t1(id int) engine=innodb;
Query OK, 0 rows affected (0.39 sec)
mysql> create table t2(id int) engine=myisam;
Query OK, 0 rows affected (0.14 sec)
mysql> create table t3(id int) engine=blackhole;
Query OK, 0 rows affected (0.14 sec)
mysql> create table t4(id int) engine=memory;
Query OK, 0 rows affected (0.22 sec)
mysql> show tables;
+-----------------+
| Tables_in_day02 |
+-----------------+
| t1 |
| t2 |
| t3 |
| t4 |
+-----------------+
4 rows in set (0.00 sec)
【2】innodb引擎
- frm:存储的表结构
- idb:存储表的数据
- 特点:存储数据持久化存储退出也会存在
mysql> insert into t1 values(1);
Query OK, 1 row affected (0.37 sec)
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
【3】myisam引擎
- frm:存储的表结构
- MYD:表的数据
- MYI:表的索引结构
- 特点:存储数据持久化存储,退出也会存在
mysql> insert into t2 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
【4】blackhole引擎
- frm:存储的表结构
- 特点:存储数据不会有任何反应,不会存储任何数据
mysql> insert into t3 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t3;
Empty set (0.00 sec)
【5】memory引擎
- frm:储存的表结构
- 特点就是基于内存的存储,只要服务重启,数据就会全部丢失
mysql> insert into t4 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
# 终端:
C:\WINDOWS\system32>net stop mysql57
C:\WINDOWS\system32>net start mysql57# 重启MySQL
Database changed
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
mysql> select * from t2;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> select * from t3;
Empty set (0.00 sec)
mysql> select * from t4;
Empty set (0.00 sec)
【二】约束条件(null)
# 【一】完整的建表语句
-- 最后一个字段不要加 ,!
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 3
create table t5(
id int
);
mysql> desc t5;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
-- 上面的 int(11) 这个 11 就是当前字段的宽度(0-10)
-- 有的字段是带有默认宽度的
mysql> insert into t5 values(12345678912);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> insert into t5 values(1234567891);
Query OK, 1 row affected (0.03 sec)
-- 有的mysql版本是默认开启长度限制的,超过最大长度会报错
-- 有的版本是不开启,如果超出最大长度则会按照最大长度截取数据
【三】严格模式
- 控制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 |
mysql> create table t9 (id tinyint);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: day02
Query OK, 0 rows affected (0.77 sec)
mysql> show tables;
+-----------------+
| Tables_in_day02 |
+-----------------+
| t1 |
| t2 |
| t3 |
| t4 |
| t9 |
+-----------------+
5 rows in set (0.00 sec)
mysql> desc t9;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t9 values(-128);
Query OK, 1 row affected (0.14 sec)
mysql> insert into t9 values(-129);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> select * from t9;
+------+
| id |
+------+
| -128 |
+------+
mysql> insert into t9 values(127);
Query OK, 1 row affected (0.03 sec)
mysql> select * from t9;
+------+
| id |
+------+
| -128 |
| 127 |
+------+
2 rows in set (0.00 sec)
mysql> insert into t9 values(128);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
【2】有无符号
-- unsigned 无符号(就是不能存复数);
mysql> create table t10(id tinyint unsigned);
Query OK, 0 rows affected (0.35 sec)
mysql> desc t10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id | tinyint(3) unsigned | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t10 values(1);
Query OK, 1 row affected (0.36 sec)
mysql> insert into t10 values(-1);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
【3】字段类型的宽度
- 字段类型后面跟着的宽度只是显示的宽度
- 插入的长度是按照,当前字段的最大长度进行限制
create table t11(id int(4));
【4】约束条件之zerofill
# 默认长度是10;
mysql> create table t13(id int(8) unsigned zerofill);
Query OK, 0 rows affected (0.34 sec)
mysql> desc t13;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id | int(8) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t13 values(1);
Query OK, 1 row affected (0.12 sec)
mysql> select * from t13;
+----------+
| id |
+----------+
| 00000001 |
+----------+
1 row in set (0.00 sec)
mysql> insert into t13 values(123456789);
Query OK, 1 row affected (0.12 sec)
mysql> select * from t13;
+-----------+
| id |
+-----------+
| 00000001 |
| 123456789 |
+-----------+
2 rows in set (0.00 sec)
mysql> insert into t13 values(123456789123);
ERROR 1264 (22003): Out of range value for column 'id' at
【五】字段类型之浮点型
【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 位
double(255,30)
# 总共255位 , 小数部分占 30 位
decimal(65,30)
# 总共65位 , 小数部分占 30 位
mysql> create table t15(id float(255,30));
Query OK, 0 rows affected (0.17 sec)
mysql> create table t16(id double(255,30));
Query OK, 0 rows affected (0.16 sec)
mysql> create table t17(id decimal(65,30));
Query OK, 0 rows affected (0.16 sec)
mysql> desc t15;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | float(255,30) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> desc t16;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| id | double(255,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> 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);
mysql> insert into t15 values(1.1111111111111111111111);
Query OK, 1 row affected (0.03 sec)
mysql> insert into t16 values(1.1111111111111111111111);
Query OK, 1 row affected (0.02 sec)
mysql> insert into t17 values(1.1111111111111111111111);
Query OK, 1 row affected (0.03 sec)
mysql> select * from t15;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t16;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t17;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111111111100000000 |
+----------------------------------+
1 row in set (0.00 sec)
-- float 类型 从第8为开始模糊
-- double 类型 从第16为开始模糊
-- decimal 类型 从23为开始模糊
--- 精确度 decimal > double > float
【六】字段类型之字符串类型
【1】字符串类型
(1)char
-- 定长字符串 , 给长度 4 位,超出会报错,不够默认用空格补全
# 定
(2)varchar
-- 不定长字段,给 4 个长度,超过四个直接报错,有几个存几个
# 可变
【2】创建表
create table t18(name char(4));
create table t19(name varchar(4));
mysql> create table t18(name char(4));
Query OK, 0 rows affected (0.17 sec)
mysql> create table t19(name varchar(4));
Query OK, 0 rows affected (0.13 sec)
mysql> desc t18;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| name | char(4) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> desc t19;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | varchar(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
【3】插入数据
-- 插入数据
insert into t18 values('a');
insert into t19 values('a');
mysql> insert into t18 values('a');
Query OK, 1 row affected (0.03 sec)
mysql> insert into t19 values('a');
Query OK, 1 row affected (0.02 sec)
mysql> select * from t18;
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
mysql> select * from t19;
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
超过长度:
insert into t18 values('dream');
insert into t19 values('dream');
mysql> insert into t18 values('dream');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t19 values('dream');
ERROR 1406 (22001): Data too long for column 'name' at row 1
【4】查看长度
mysql> insert into s18 values('aaaa');
ERROR 1146 (42S02): Table 'day02.s18' doesn't exist
mysql> insert into t18 values('aaaa');
Query OK, 1 row affected (0.36 sec)
mysql> select * from t18;
+------+
| name |
+------+
| a |
| abcd |
| aaaa |
+------+
3 rows in set (0.00 sec)
mysql> select char_length(name) from t18;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
| 4 |
| 4 |
+-------------------+
3 rows in set (0.00 sec)
【5 】取消默认去除空格
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.35 sec)
-- 在修改严格模式的时候去除或者增加单个 带上原来的
-- 覆盖掉
【6】char 与 varchar 的比较
(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
);
mysql> 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.17 sec)
mysql> 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)
insert into student values(
1,
'dream',
'2024',
'2024-5-31',
'11:11:11',
'2023-6-30 11:11:11'
);
mysql> insert into student values(
-> 1,
-> 'dream',
-> '2024',
-> '2024-5-31',
-> '11:11:11',
-> '2023-6-30 11:11:11'
-> );
Query OK, 1 row affected (0.03 sec)
mysql> select * from student;
+------+-------+-----------+------------+------------+---------------------+
| id | name | born_year | birth | study_time | reg_time |
+------+-------+-----------+------------+------------+---------------------+
| 1 | dream | 2024 | 2024-05-31 | 11:11:11 | 2023-06-30 11:11:11 |
+------+-------+-----------+------------+------------+---------------------+
insert into student values(
1,
'dream',
'128',
'2024-5-31',
'11:11:11',
'2023-6-30 11:11:11'
);
-- ERROR 1264 (22003): Out of range value for column 'born_year' at row 1
【八】字段类型之枚举和集合类型
【1】枚举和集合
-- 枚举:多选一 用枚举类型给多个备选项,但只能一个 enum
-- 集合:多选多 用集合类型给多个备选项,但你能选多个 set
【2】枚举类型 enum
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
mysql> create table user(
-> id int,
-> name char(16),
-> gender enum('male','female','others')
-> );
Query OK, 0 rows affected (0.15 sec)
mysql> 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(id,name,gender) values(1,'dream','male');
mysql> insert into user(id,name,gender) values(1,'dream','male');
Query OK, 1 row affected (0.03 sec)
mysql> select * from user;
+------+-------+--------+
| id | name | gender |
+------+-------+--------+
| 1 | dream | male |
+------+-------+--------+
1 row in set (0.00 sec)
insert into user(id,name,gender) values(1,'dream','male,female');
mysql> insert into user(id,name,gender) values(1,'dream','male,female');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
【3】集合类型 set
create table teacher(
id int,
name varchar(16),
gender enum('male','female','others'),
hobby set('read books','listen music','play games')
);
mysql> 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.21 sec)
mysql> 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'
);
mysql> insert into teacher values(
-> 1,
-> 'dream',
-> 'male',
-> 'read books'
-> );
Query OK, 1 row affected (0.03 sec)
mysql> 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'
);
mysql> insert into teacher values(
-> 2,
-> 'chimeng',
-> 'female',
-> 'read books,listen music'
-> );
Query OK, 1 row affected (0.03 sec)
mysql> select * from teacher;
+------+---------+--------+-------------------------+
| id | name | gender | hobby |
+------+---------+--------+-------------------------+
| 1 | dream | male | read books |
| 2 | chimeng | female | read books,listen music |
+------+---------+--------+-------------------------+
2 rows in set (0.00 sec)
【九】总结
【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 = "";

浙公网安备 33010602011771号