MySQL库的操作

发布于:2025-09-15 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

1. 创建数据库

1.1 语法

2. 创建数据库案例

2.1 创建名为db1的数据库

2.2 创建一个使用utf8字符集的db2数据库

2.3 创建一个使用utf字符集,并带校验规则的db3数据库。

3. 字符集和校验规则

3.1 查看系统默认字符集以及校验规则

3.2 查看数据库支持的字符集

3.3 查看数据库支持的字符集校验规则

3.4 校验规则对数据库的影响

3.4.1 不区分大小写

3.4.2 区分大小写

3.4.3 结果排序

4. 操纵数据库

4.1 查看数据库

4.2 显示创建语句

4.3 显示当前在哪个数据库中

4.4 修改数据库

4.5 数据库删除

4.6 备份和恢复

4.6.1 备份

4.6.1.1 语法

4.6.1.2 示例:将d1库备份到文件

4.6.2 还原

4.6.2 1 语法

4.6.2.2 示例

4.6.3 注意事项

4.7 查看连接情况

4.7.1 语法

4.7.2 示例

5. 总结


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. 总结

        我们学习了库的增删查改,我们的数据库没办法很直接的对库做重命名,库一旦创建好了,轻易不要动,因为上层的应用,随便一个应用都是用的你这个库的名字,要是改了,上层应用就跑不起来了,库的删除也不敢随便删,只要数据库一旦建好,最多把字段改一改,数据库轻易不要删没数据库名字轻易不要改。


网站公告

今日签到

点亮在社区的每一天
去签到