1. 创建与删除数据库
创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:
DEFAULT\] CHARACTER SET charset_name \[DEFAULT\] COLLATE collation_name
- db_name:数据库名
- IF NOT EXISTS:如果要创建的数据库不存在就创建,存在就不创建(避免报错)
- CHARACTER SET:指定数据库采用的字符集
- COLLATE:指定数据库字符集的校验规则
创建名为db1的数据库:create database db1:
bash
mysql> show databases;
+---------------------+
| Database |
+---------------------+
| db1 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+---------------------+
6 rows in set (0.01 sec)
当我们创建数据库没有指定字符集和校验规则时,系统会使用默认字符集和校验规则 。我的系统默认字符集是 utf8mb4 ,默认校验规则是 utf8mb4_0900_ai_ci(如下图所示)。
bash
mysql> show create database db1;
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
删除数据库
语法:drop database db_name
删除名为db1的数据库:drop database db1:
bash
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)
mysql> drop database db1;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
总结:创建数据库:create database db_name;删除数据库:drop database db_name。
创建数据库的本质,就是在某条特定的路径下创建一个目录。删除数据库的本质,就是删除在某条特定的路径下删除一个目录。
注意:删除数据库会连同里面的所有数据表一起删除,建议不要随意删除。
2. 数据库编码
创建数据库时,涉及两个编码集:
- 数据库编码集:数据库存储数据时使用的编码格式
- 数据库校验集:数据库读取数据时使用的编码格式
核心原则 :数据库对数据做任何操作,都必须保证操作和编码保持一致。
查看系统默认字符集以及校验规则:
show variables like 'character_set_database'; 查看系统默认字符集
show variables like 'collation_database'; 查看系统默认校验规则
我的系统默认字符集是 utf8mb4,默认校验规则是 utf8mb4_0900_ai_ci。
bash
mysql> show variables like 'character_set_database';
+------------------------+---------+
| Variable_name | Value |
+------------------------+---------+
| character_set_database | utf8mb4 |
+------------------------+---------+
1 row in set (0.01 sec)
mysql> show variables like 'collation_database';
+--------------------+-------------------+
| Variable_name | Value |
+--------------------+-------------------+
| collation_database | utf8mb4_0900_ai_ci |
+--------------------+-------------------+
1 row in set (0.01 sec)
实际上,目前整个数据库的校验规则都是 utf8mb4_09:
bash
mysql> show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
+----------------------+-------------------+
3 rows in set (0.01 sec)
输入 show charset; 查看数据库支持的所有字符集:
bash
mysql> show charset;
+----------+---------------------------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+-------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| binary | Binary pseudo charset | binary | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8mb3 | UTF-8 Unicode | utf8mb3_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+-------------------+--------+
输入 show collation; 查看数据库支持的校验规则。
创建指定字符集/校验规则的数据库
创建一个使用 utf8mb4 字符集的db2数据库:create database db2 charset=utf8mb4;或者 create database db2 character set utf8mb4;
bash
mysql> create database db2 charset=utf8mb4;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db2 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
总结:创建一个使用特定字符集的数据库 :create database db_name charset=charset_name; 或者 create database db_name character set utf8mb4;。
创建使用 utf8mb4_0900_ai_ci 校验规则的 db3 数据库:create database db3 collate utf8mb4_0900_ai_ci;
bash
mysql> create database db3 collate utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db2 |
| db3 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
总结:创建一个使用特定校验规则的数据库 :create database db_name collate collate_name。
校验规则的区别演示
创建一个校验规则为 utf8mb4_0900_ai_ci(不区分大小写 )的数据库:create database db_name collate utf8mb4_0900_ai_ci;
bash
mysql> create database databasel collate utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.01 sec)
mysql> use databasel;
Database changed
mysql> create table test(name varchar(20));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into test values('a');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values('A');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values('b');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values('B');
Query OK, 1 row affected (0.01 sec)
不区分大小写时的排序和查询结果:
bash
mysql> use database1;
Database changed
mysql> select * from test order by name;
+-------+
| name |
+-------+
| a |
| A |
| b |
| B |
+-------+
4 rows in set (0.00 sec)
创建一个校验规则为 utf8mb4_bin(区分大小写 )的数据库:create database db_name collate utf8mb4_bin;
cpp
mysql> create database database2 collate utf8mb4_bin;
Query OK, 1 row affected (0.01 sec)
mysql> use database2;
Database changed
mysql> create table test(name varchar(20));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into test values('a');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values('A');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values('b');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values('B');
Query OK, 1 row affected (0.01 sec)
区分大小写时的排序和查询结果:
bash
mysql> use database2;
Database changed
mysql> select * from test order by name;
+-------+
| name |
+-------+
| A |
| B |
| a |
| b |
+-------+
4 rows in set (0.00 sec)
结论 :校验规则不同,查询和排序的结果也会不同。
为什么要在数据库层面设置字符集和校验规则? 为了能够存储任意字符集和校验规则 的表格。实际开发中,如果没有特殊需求,按数据库默认的字符集和校验规则创建即可,需要指定时再单独配置。
3. 操作数据库
查看所有数据库:show databases;
bash
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| database1 |
| database2 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
查看数据库的创建语句:show create database db_name;
cpp
mysql> show create database database1;
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| database1 | CREATE DATABASE `database1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
!40100 表示:如果当前使用的mysql版本是大于401,就执行后续的语句,后面就是默认的字符集和校验规则,即 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N',这就是默认字符集和校验规则。
确认当前正在使用的数据库:select database();
bash
mysql> select database();
+------------+
| database() |
+------------+
| database1 |
+------------+
1 row in set (0.00 sec)
修改数据库,语法:
ALTER DATABASE db_name [alter_spacification [,alter_spacification]...] alter_spacification:
DEFAULT\] CHARACTER SET charset_name \[DEFAULT\] COLLATE collation_name
查看表中的字段:desc 表名;
cpp
mysql> desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.01 sec)
4. 数据库的备份与还原
备份整个数据库 ------ 语法:mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
示例:将数据库 database1 备份到当前路径下的 database1.sql 文件中:
bash
root@hcss-ecs-3ea8:/home/xayy/MYSQL# mysqldump -P3306 -uroot -p -B database1 > database1.sql
Enter password:
root@hcss-ecs-3ea8:/home/xayy/MYSQL# ls
database1.sql
备份文件中的内容:将历史上对 database1 数据库执行过的所有有效操作都保存了下来。
bash
-- MySQL dump 10.13 Distrib 8.0.46, for Linux (x86_64)
--
-- Host: localhost Database: database1
-- ------------------------------------------------------
-- Server version 8.0.46
/*!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 */;
/*!50503 SET NAMES utf8mb4 */;
/*!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: `database1`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `database1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
USE `database1`;
--
-- Table structure for table `test`
--
DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `test` (
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `test`
--
LOCK TABLES `test` WRITE;
/*!40000 ALTER TABLE `test` DISABLE KEYS */;
INSERT INTO `test` VALUES ('a'),('A'),('b'),('B');
/*!40000 ALTER TABLE `test` 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 2026-05-02 16:05:57
还原 ------ 语法:source 文件路径
bash
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| database2 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> source /home/xay/MYSQL/database1.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, 1 row affected (0.01 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.01 sec)
Query OK, 4 rows affected (0.00 sec)
Records: 4 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 (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 |
+--------------------+
| database1 |
| database2 |
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
备份一张或多张表(不备份整个数据库) :mysqldump -u root -p 数据库名 表名1 表名2 > 文件路径/文件名
同时备份多个数据库:mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
如果备份一个数据库时,没有带上-B参数,在恢复数据库时需要
- 先手动创建空的数据库
- 使用 use 数据库名; 选中它
- 再执行 source 恢复
查看数据库的连接情况:show processlist;
bash
mysql> show processlist;
+----+-----------------+-----------+------------+---------+------+-------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------------+---------+------+-------------------+------------------+
| 7 | event_scheduler | localhost | NULL | Daemon | 1625443 | Waiting on empty queue | NULL |
| 30 | root | localhost | database1 | Query | 0 | init | show processlist |
+----+-----------------+-----------+------------+---------+------+-------------------+------------------+
2 rows in set, 1 warning (0.00 sec)