目录
2.3 创建一个使用utf字符集,并带校验规则的db3数据库。
1. 创建数据库
1.1 语法
show databases; #查看数据库
create database database1; #创建数据库
drop database database1; #删除数据库
我们可以看到我们创建好数据库,在Linux中的/var/lib/mysql目录下能看到该文件夹,那么我们删除该数据库看看有什么变化。
我们可以看到,我们删除数据库,对应的文件夹也就没有了。
当然,我们也可以在目录下创建文件,我们在查询数据库的时候也可以查询的到。
其实他俩之间是可以连通的,不过我们绝对不能在目录下手动创建数据库。
加上if not exists的话,就说明有该数据库的话就不创建,没有该数据库则不创建。warning的意思就是这个数据库以及存在了,对不起,没有给你创建。
2. 创建数据库案例
2.1 创建名为db1的数据库
create database db1;
说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf_general_ci。
2.2 创建一个使用utf8字符集的db2数据库
create database db2 charset=utf8;
2.3 创建一个使用utf字符集,并带校验规则的db3数据库。
create database db3 charset=utf8 collate utf8_general_ci;
如果用户指定了编码,那么就用用户指定的编码,如果没有,就用配置文件中的编码。
3. 字符集和校验规则
3.1 查看系统默认字符集以及校验规则
show variables like 'character_set_database';
show variables like 'collation_database';
show variables like 'collation_%';
取的时候我们也不要只看database的。
我们对应的连接也是utf8的,数据库本事的校验规则也是utf8的,服务器本事的内部校验还是utf8的。
我们已经在mysql配置文件中设置了编码,所以这里是符合我们的要求的。
3.2 查看数据库支持的字符集
show charset;
字符集主要是控制用什么语言。比如utf8就可以使用中文。
这个负责你数据库的写用什么编码。
3.3 查看数据库支持的字符集校验规则
show collation;
这个负责你数据库的读用什么编码。
3.4 校验规则对数据库的影响
3.4.1 不区分大小写
创建一个数据库,校验规则使用utf8_general_ci[不区分大小写]
create database test1 collate utf8_general_ci; #创建数据库,指定校验集
use test1; #切换到test1数据库
create table if not exists person(name varchar(20)); #创建表
show tables; #显示数据库中所有的表
desc person; #查看person的表结构
insert into person (name) values ('A'); #插入数据
select * from person; #查看表中的数据
select * from person where name='a'; #选择条件查找表中的数据
mysql> create database test1 collate utf8_general_ci; #创建数据库,指定校验集
Query OK, 1 row affected (0.00 sec)
mysql> use test1; #切换到test1数据库
Database changed
mysql> create table if not exists person(name varchar(20)); #创建表
Query OK, 0 rows affected (0.02 sec)
mysql> show tables; #显示数据库中所有的表
+-----------------+
| Tables_in_test1 |
+-----------------+
| person |
+-----------------+
1 row in set (0.00 sec)
mysql> desc person; #查看表的结构
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into person (name) values ('A'); #插入数据A
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('B'); #插入数据B
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('C'); #插入数据C
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('a'); #插入数据a
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('b'); #插入数据b
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('d'); #插入数据d
Query OK, 1 row affected (0.00 sec)
mysql> select * from person;
+------+
| name |
+------+
| A |
| B |
| C |
| a |
| b |
| d |
+------+
6 rows in set (0.00 sec)
mysql> select * from person where name='a';
+------+
| name |
+------+
| A |
| a |
+------+
2 rows in set (0.00 sec)
我们可以看到我们查找a,把a和A都查出来了,这就叫做utf8_general_ci不区分大小写。
3.4.2 区分大小写
创建一个数据库,校验规则适用utf8_bin[区分大小写]
create database test2 collate utf8_bin; #创建数据库,指定校验集
use test1; #切换到test1数据库
create table if not exists person(name varchar(20)); #创建表
show tables; #显示数据库中所有的表
desc person; #查看person的表结构
insert into person (name) values ('A'); #插入数据
select * from person; #查看表中的数据
select * from person where name='a'; #选择条件查找表中的数据
mysql> create database test2 collate utf8_bin; #创建数据库,指定校验集
Query OK, 1 row affected (0.00 sec)
mysql> use test2; #切换到test2数据库
Database changed
mysql> create table if not exists person (name varchar(20); #创建表
Query OK, 0 rows affected (0.02 sec)
mysql> show tables; #显示数据库下所有的表
+-----------------+
| Tables_in_test2 |
+-----------------+
| person |
+-----------------+
1 row in set (0.00 sec)
mysql> insert into person (name) values ('a'); #插入数据'a'
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('A'); #插入数据'A'
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('B'); #插入数据'B'
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('b'); #插入数据'b'
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('c'); #插入数据'c'
Query OK, 1 row affected (0.00 sec)
mysql> insert into person (name) values ('C'); #插入数据'C'
Query OK, 1 row affected (0.00 sec)
mysql> select * from person; #查询表中所有的数据
+------+
| name |
+------+
| a |
| A |
| B |
| b |
| c |
| C |
+------+
6 rows in set (0.00 sec)
mysql> select * from person where name='a'; #按照条件查询
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
在我们test2,utf8_bin的校验规则中读取中以同样的筛选条件筛选,只会给我们把’a’筛选出来,这就叫做严格匹配。
这也就是校验规则的不同,最终查出来的结果不同,进一步理解了校验规则对我们的影响。
3.4.3 结果排序
mysql> use test2;
Database changed
mysql> select * from person order by name;
+------+
| name |
+------+
| A |
| B |
| C |
| a |
| b |
| c |
+------+
6 rows in set (0.00 sec)
#大写A的ASCII码是小于大写B的,大写的ASCII码的值是整体小于小写的ASCII码的值的,所以这是升序排序
mysql> use test1;
Database changed
Database changed
mysql> select * from person order by name;
+------+
| name |
+------+
| A |
| a |
| B |
| b |
| C |
| d |
+------+
6 rows in set (0.00 sec)
#test1采用的校验是utf8_general_ci,此时它在校验比较的时候大写A和小写a是不做区分的,所以A,a,B,b,C,c各自放在一起,整体从小到大。
校验集是会影响我们的比较结果的,无论是显示的进行比较还是隐式的进行排序,都是一个道理。
4. 操纵数据库
4.1 查看数据库
show databases; #显示所有的数据库
4.2 显示创建语句
show create database d1;
说明:
- MySQL建议我们关键字使用大写,但是不是必须的。
- 数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字。
- /*!40100 default.... */这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话。
4.3 显示当前在哪个数据库中
select database();
4.4 修改数据库
alter database d1 charset=gbk collate gbk_chinese_ci;
那么修改前和修改后的db.opt文件有什么变化呢?
我们查看一下创建语句:
我们再修改回去,查询一下创建语句:
我们也可以查询一下db.opt文件,看看有什么变化。
4.5 数据库删除
mysql> drop database d2; #删除数据库d2
Query OK, 0 rows affected (0.00 sec)
mysql> drop database if exists d1; #删除数据库d2,如果存在则删除
Query OK, 0 rows affected (0.00 sec)
指定删除之后的结果:
- 数据库内部看不到对应的数据库
- 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删除。
注意:不要随意删除数据库,如果要删除,请先做备份。
4.6 备份和恢复
文件备份的话我们是将文件目录拷贝一下,那么数据库备份的话也是可以将数据库的目录拷贝一份,但这样的话是严重不推荐的,因为版本不一样的话,恢复会有问题。
MySQL也不支持对数据库重命名,之前的版本支持,不过现在去掉了,如果你重命名的话还有别人再操作这个数据库,再备份的时候重命名,这个也是严重不推荐的。
MySQL不提供拷贝或者是直接进行对数据库文件夹做重命名,也不推荐这么干,我们推荐直接使用MySQL自带的备份工具进行备份。
4.6.1 备份
4.6.1.1 语法
# mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
4.6.1.2 示例:将d1库备份到文件
mysqldump -P3306 -uroot -p -B d1 > d1.sql
#数据库没有密码的话后面不用跟,到时候直接按回车即可
查看d1.sql文件:
-- MySQL dump 10.13 Distrib 5.7.44, for Linux (x86_64)
--
-- Host: localhost Database: d1
-- ------------------------------------------------------
-- Server version 5.7.44
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Current Database: `d1`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `d1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `d1`;
--
-- Table structure for table `person`
--
DROP TABLE IF EXISTS `person`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `person` (
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `person`
--
LOCK TABLES `person` WRITE;
/*!40000 ALTER TABLE `person` DISABLE KEYS */;
INSERT INTO `person` VALUES ('A'),('B'),('C'),('a'),('b'),('c');
/*!40000 ALTER TABLE `person` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2025-09-14 15:47:18
这时,可以打开看看 mytest.sql 文件里的内容,其实把我们整个创建数据库,建表,导入数据的语句都装载这个文件中。
我们可以看到,它备份的不是只有数据,还把历史上所有操作全部备份起来了。
4.6.2 还原
首先删除d1数据库。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| RECOVER_YOUR_DATA |
| d1 |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> drop database d1;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| RECOVER_YOUR_DATA |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
删除之后/var/lib/mysql目录下也不会存在d1文件夹了
4.6.2 1 语法
mysql> source D:/mysql-5.7.22/mytest.sql;
4.6.2.2 示例
mysql> source /home/galaxy/d1.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Database changed
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> show databases; #查看数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| RECOVER_YOUR_DATA |
| d1 |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use d1;
Database changed
mysql> select * from person; #查看表中的内容
+------+
| name |
+------+
| A |
| B |
| C |
| a |
| b |
| c |
+------+
6 rows in set (0.00 sec)
4.6.3 注意事项
1. 如果备份的不是整个数据库,而是其中的一张表,怎么做?
# mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql
2. 同时备份多个数据库
# mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原。
在我们刚刚带了 -B 选项的时候,它生成的sql文件里面其实是有CREATE DATABASE这样的语句的,如果没有带-B选项,要备份这个数据库的话只会把这个数据路里面的所有的表信息,数据信息全部备份出来,要恢复的话数据库就需要自己先建立好。
4.7 查看连接情况
4.7.1 语法
show processlist;
4.7.2 示例
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 4 | root | localhost | d1 | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.01 sec)
可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况。
5. 总结
我们学习了库的增删查改,我们的数据库没办法很直接的对库做重命名,库一旦创建好了,轻易不要动,因为上层的应用,随便一个应用都是用的你这个库的名字,要是改了,上层应用就跑不起来了,库的删除也不敢随便删,只要数据库一旦建好,最多把字段改一改,数据库轻易不要删没数据库名字轻易不要改。