目录
2.2.数据库校验集—> 支持数据库,进行字段比较使用的编码。本质也是一种读取数据库中数据采用的编码格式。
1.创建和删除数据库
我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:
create database 数据库名;
例如我们可以创建一个名为helloworld的数据库
create database helloworld;
上面是我们之前使用的语句,现在我们来好好学习创建数据库的语法。
1.1.创建数据库语法
创建数据库的语法如下:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
在SQL中,创建一个数据库(如果它还不存在)的语法允许你指定一些额外的创建规格(create_specification),比如字符集(CHARACTER SET)和排序规则(COLLATE)。
下面是这条命令的详细解释:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
- CREATE DATABASE:这是创建数据库的命令。
- [IF NOT EXISTS]:这是一个可选部分,表示如果数据库已经存在,那么不执行创建操作,防止因尝试创建已存在的数据库而导致的错误。
- db_name:这是你想要创建的数据库的名称。
- [create_specification [, create_specification] ...]:这是一个或多个创建规格的选项列表,你可以用它来指定数据库的某些属性,比如字符集和排序规则。这些选项是可选的,并且可以用逗号分隔列出多个。
create_specification 可以包括:
- [DEFAULT] CHARACTER SET charset_name:指定数据库的默认字符集。charset_name 是你想要使用的字符集的名称。DEFAULT 关键字是可选的。
- [DEFAULT] COLLATE collation_name:指定数据库的默认排序规则。collation_name 是你想要使用的排序规则的名称。DEFAULT 关键字也是可选的。
举个例子,如果你想创建一个名为 my_database 的数据库,并且指定它的字符集为 utf8mb4,排序规则为 utf8mb4_unicode_ci,你可以使用以下SQL命令:
CREATE DATABASE IF NOT EXISTS my_database
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
这条命令会检查 my_database 数据库是否存在,如果不存在,则创建一个新的数据库,并设置其字符集为 utf8mb4 和排序规则为 utf8mb4_unicode_ci。
1.2.删除数据库语法
这里对于删除数据库我们会讲两种方法:(如下)
DROP DATABASE 数据库名;
上面这种方式下如果我们想要删除的数据库不存在,执行就会出现错误
DROP DATABASE IF EXISTS 数据库名;
上面这种方式下如果我们想要删除的的数据库存在,就删除成功,即使是我们想要删除的数据库不存在,这个时候执行也不会出现错误
1.3.创建和删除数据库案例
- 最简单的创建和删除
接下来我们创建一个名为database1的数据库
同时,我们在/var/lib/mysql目录下面也能发现多了一个目录文件,名为database1
如果我们想删除一个数据库,那么我们就执行下面这个即可
同时/var/lib/mysql目录下面的database1目录也不见了
- 创建一个数据库本质就是在/var/lib/mysql目录创建一个目录文件
- 删除一个数据库本质就是在/var/lib/mysql目录删除一个目录文件
- 创建时添加IF NOT EXISTS
我们使用一下我们的database2
我们再次创建试试看
显然,没有创建新的database2!!!
2.数据库编码集
一般数据库相关常见数据库编码有两个重要的编码,一个是数据库字符集,一个是数据库校验集。
创建数据库的时候,有两个编码集:
- 1.数据库编码集
- 2.数据库校验集
只要是数据无论是未来的存储还是读取,数据一定是要有对应的编码格式的。数据库这种与数据打交道的软件更加注重编码集。编码集必须是统一的,就是存数据之前采用什么编码,取数据时必须以同样的编码去取。
2.1.数据库字符集 —> 数据库未来存储数据采用的编码集
数据库字符集(Character Set)定义了数据库中可以存储哪些字符。字符集决定了数据库如何解释存储的字节序列。例如,UTF-8 是一种广泛使用的字符集,它支持多种语言的字符,包括英语、中文、日文等。
当您创建数据库或表时,可以指定一个字符集。这个字符集将决定:
- 数据库如何存储文本数据。
- 当您从数据库中检索数据时,数据如何被解码和显示。
选择正确的字符集对于确保数据的正确性和可读性至关重要。如果字符集选择不当,可能会导致数据损坏或无法正确显示。
字符集主要定义了数据库中可以存储哪些字符以及如何对这些字符进行编码。它是字符与二进制数据之间的映射关系,用于在计算机中表示和存储文本数据。不同的字符集支持不同的字符集合,例如ASCII主要支持英文字符,而Unicode和UTF-8则支持包括中文、日文、韩文等多种语言的字符。
在选择字符集时,需要考虑数据库需要支持的语言种类、字符数量以及与其他系统的兼容性等因素。例如,如果数据库需要存储中文数据,那么就应该选择支持中文的字符集,如UTF-8或GBK等。
将来把数据存到数据库里,未来要对数据做各种增、删、查、改。所有只要你这样你就是要做比较。要比较对应的某些字段一样,前提是都要先被读出来,那两个字段的被读出来的校验规则或者被读取时的编码规则必须也是一样的。要不然怎么保证是一样的呢。
2.2.数据库校验集—> 支持数据库,进行字段比较使用的编码。本质也是一种读取数据库中数据采用的编码格式。
数据库校验集(Collation)定义了数据库中字符的比较和排序规则。校验集是基于字符集的,但它提供了额外的规则来定义字符如何进行比较和排序。
例如,对于包含重音字符的语言(如法语、西班牙语),您可能需要选择一个支持这些字符正确排序和比较的校验集。不同的校验集可能会以不同的方式处理重音字符和大小写敏感性。
当您创建数据库或表时,也可以指定一个校验集。这个校验集将决定:
- 当您执行查询(如 SELECT、WHERE 子句)时,字符如何进行比较。
- 当您对数据进行排序(如 ORDER BY 子句)时,字符的排序顺序。
所以不管是保存时用的是什么编码还是对比读取采用的编码必须得是一样的。因此数据库不论对数据做任何操作,都必须保证操作和编码必须是编码一致的。
校验集,也称为排序规则或字符序,是基于字符集定义的,用于指定字符之间的比较和排序规则。不同的校验集可能会以不同的方式处理大小写敏感性、重音字符等。
例如,在某些校验集下,大写字母和小写字母被视为相同(不区分大小写),而在其他校验集下则被视为不同(区分大小写)。此外,对于包含重音字符的语言,不同的校验集可能会以不同的方式处理这些字符的排序。
选择适当的校验集对于确保查询结果的准确性和排序的正确性至关重要。例如,在区分大小写的校验集下,查询"John"将不会返回"john"的记录;而在不区分大小写的校验集下,这两个查询将被视为相同。
- 字符集和校验集的区别
- 字符集定义了数据库中可以存储哪些字符以及如何对这些字符进行编码;
- 而校验集则基于字符集定义了字符之间的比较和排序规则。
数据库无论对数据做任何操作,都必须保证操作和编码必须是一致的
2.3.查看系统默认和支持的编码集
查看系统默认字符集的指令如下:
show variables like 'character_set_database';
可以看到默认字符集就是utf8mb3。
查看系统默认校验集的指令如下:
show variables like 'collation_database';
可以看到默认校验集就是utf8mb3_general_ci。
查看数据库支持的字符集
show charset;
可以看到有很多啊。
如果你细心,且对utf8编码集了解过的话,你可能会产生下面的疑惑。
- 为什么MySQL里面的utf8是3个字节,正常来说utf8是1~4个字节啊?
- 答案是:MySQL 中的 utf8 并不是真正的 UTF-8 编码!utf8mb4 才是真正的UTF-8!
查看系统支持的校验集
show collation;
有很多,我不一一展示了。
2.4.查看特定数据库和表的编码集
- 使用SQL语句查询数据库的字符集:
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='your_database_name';
将your_database_name替换为你要查询的数据库名称。
例如
- 使用SQL语句查询数据库的校验集:
SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='your_database_name';
同样,将your_database_name替换为你要查询的数据库名称。
例如
- 查询表的字符集和校验集:
如果你想查看特定表的字符集和校验集,可以使用以下SQL语句:
SHOW TABLE STATUS FROM your_database_name;
这将返回该数据库中所有表的状态信息,包括字符集和校验集。
- 查询列的字符集和校验集:
使用以下SQL语句可以查看某个表中某列的字符集和校验集:
SHOW FULL COLUMNS FROM your_table_name;
将your_table_name替换为你要查询的表名称。
2.4.指定编码创建数据库案例
- 采用默认的编码格式和校验规则创建数据库
创建数据库时将所有的可选项都去掉即可
create database db1;
- 创建指定utf8编码格式创建数据库
create database db2 charset=utf8;
其中SQL中的charset=utf8,也可以写成character set=utf8或character set utf8。
- 指定utf8编码格式和utf8_general_ci校验规则创建数据库
create database db3 charset=utf8 collate utf8_general_ci;
其中SQL中的collate utf8_general_ci,也可以写成collate=utf8_general_ci
事实上,我们在配置文件里面配置了
2.5.校验规则对数据库的影响
现在我们已经知道了,为了保证读取的数据和存储的数据是一致的,因此字符集编码格式和校验规则必须是对应的。但实际同一字符集编码格式一般会有多种可选择的校验规则,比如utf8编码格式的校验规则有utf8_general_ci、utf8_bin、utf8_unicode_ci等校验规则。
使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8_general_ci校验规则在比对数据时是不区分大小写的,而utf8_bin校验规则在对比数据时则是区分大小写的。
2.5.1.不区分大小写
首先我们创建一个数据库
create database db3 charset=utf8 collate utf8_general_ci;
在刚才我们创建的db3数据库时使用的是utf8_general_ci的校验规则,我们选择使用这个数据库use db3。
- 查看db3的字符集
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='db3';
- 查看db3的校验集
SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='db3';
在该数据库中同样创建一张person表,再不作设置的情况下该person表会将继承当前数据库的编码格式和校验规则。
use db3;
create table person(name varchar(20));
这时向表中插入一些数据。如下:
insert into person values ('A');
insert into person values ('a');
insert into person values ('B');
insert into person values ('b');
insert into person values ('c');
insert into person values ('D');
通过select
语句可以查看插入表中的数据。如下:
select * from person;
这时指定查看表中name='A'的记录时会将A和a一并筛选出来,根本原因就是utf8_general_ci校验规则在进行数据比对时是不区分大小写的。如下:
select * from person where name='A';
2.5.2.区分大小写
操作与前面类似
create database db4 charset=utf8 collate=utf8_bin;
show databases;
use db4;
create table person(name varchar(20));
这时向表中插入一些数据。如下:
insert into person values ('A');
insert into person values ('a');
insert into person values ('B');
insert into person values ('b');
insert into person values ('c');
insert into person values ('D');
这时指定查看表中name='A'的记录时会将A和a区分出来,根本原因就是utf8_bin校验规则在进行数据比对时是不区分大小写的。如下:
select * from person where name='A';
3.数据库的增删查改
3.1.查看数据库
使用show databases可以查看系统中所有的数据库。如下:
show databases;
3.2.查看当前正在使用的数据库
select database();
database()是一个MySQL函数
我现在正在使用db4数据库
3.3.使用数据库
use 数据库名;
3.4.显示创建语句
使用show create database 数据库名可以查看对应数据库的在创建时的语句。如下:
show create database 数据库名;
说明一下:
- MySQL建议SQL中的关键字使用大写,但不是必须的。
- 数据库的名字加上反引号,是为了防止使用的数据库名与关键字冲突。
- /*!40100 是一个条件注释,它告诉 MySQL 只有在版本 4.01.00 或更高版本时才包含这部分内容。如果你的 MySQL 服务器版本低于这个版本,这部分内容将被忽略。
- /*!40100 DEFAULT CHARACTER SET utf8mb3 */是一个条件注释,它表示当前MySQL版本如果大于4.10,则执行后面的SQL语句。
- /*!80016也是如此
3.5.数据库删除
删除数据库的SQL语法如下:
DROP DATABASE [IF EXISTS] db_name;
- IF EXISTS,表示存在就删除
执行删除之后的结果:
- show databases;看不到对应的数据库了。
对应的数据库文件夹被删除,级联删除,里面的数据表全部被删。
注意:不要随意删除数据库
drop database if exists db4;
show databases;
3.6.修改数据库
这里说的修改数据库其实主要指的是修改数据库的「字符集」或「校验规则」。
修改数据库的SQL语法如下:
ALTER DATABASE db_name [[DEFAULT] CHARSET=character_name] [[DEFAULT] COLLATE=collation_name];
这条SQL语句用于修改已存在的数据库db_name的默认字符集(Charset)和排序规则(Collation)。下面是对这条语句的详细解释:
- ALTER DATABASE:这是用来修改数据库属性的SQL命令。
- db_name:这是你想要修改的数据库的名称。
- [[DEFAULT] CHARSET=character_name]:这部分是用来指定数据库的默认字符集。CHARSET是字符集(Character Set)的缩写,用于定义数据库中可以存储哪些字符。character_name是你想要设置的字符集名称,例如utf8、utf8mb4等。DEFAULT关键字是可选的,表示这是数据库的默认字符集设置。
- [[DEFAULT] COLLATE=collation_name]:这部分是用来指定数据库的默认排序规则。COLLATE是排序规则(Collation)的缩写,用于定义数据库在比较和排序字符串时使用的规则。collation_name是你想要设置的排序规则名称,例如utf8_general_ci(不区分大小写)、utf8_bin(区分大小写)等。同样,DEFAULT关键字是可选的,表示这是数据库的默认排序规则设置。
- 在使用这条语句时,你可以同时修改字符集和排序规则,也可以只修改其中之一。需要注意的是,并不是所有的字符集都支持所有的排序规则,所以选择的排序规则必须与字符集兼容。
例如,如果你想要将名为mydatabase的数据库的默认字符集修改为utf8mb4,默认排序规则修改为utf8mb4_unicode_ci,你可以使用如下的SQL语句:
ALTER DATABASE mydatabase DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
这条语句将会更新mydatabase数据库的默认字符集和排序规则。
我们看个例子,我们看看db3的字符集和排序规则
现在我们进行对db3一些修改,字符集改为gbk,并将数据库的校验规则改为gbk_chinese_ci。
alter database db3 charset=gbk collate=gbk_chinese_ci;
4.库的备份和恢复
在我们安装数据库mysql时,同时会给我们安装一个mysqldump的工具,通过这个工具我们可以进行数据库的备份。
4.1.数据库备份
这个mysqldump的使用语法是:
mysqldump -P 端口号 -u 用户名 -p 密码 -B 数据库名1 数据库名2 ... > 数据库备份存储的文件路径
示例,将db3库备份到db3.sql文件里
mysqldump -P 3306 -u root -p -B db3 > /home/zs_113/A/db3.sql
我们打开这个文件看看
可以看到,文件中的内容实际就是我们在该数据库中执行的各种SQL命令,包括创建数据库、创建表、插入数据等SQL语句。
4.2.数据库恢复
恢复的命令是:
source 数据库备份存储的文件路径
我们先把数据库db3
给删除。然后用恢复命令把db3恢复过来。
很好,明显就是恢复了
4.3.表的备份
使用如下命令即可对指定表进行备份:
mysqldump -P 端口号 -u 用户名 -p 密码 数据库名 表名1 表名2 ... > 表备份存储的文件路径
例如,把db3数据库里的person表备份下来
很好吧!
4.4.表的恢复
很好,表的恢复也是使用source
source 表备份存储的文件路径
我们举个例子,
这时我们可以创建一个空的数据库并在该数据库中执行如下命令即可对表进行恢复。
create database temp;
show databases;
use temp;
库创建好了,我们马上进行恢复
很好,已经恢复了
总结:如果备份一个数据库时,没有带上
-B
参数(备份数据库), 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source
来还原。
5.查看连接情况
SHOW PROCESSLIST 是 MySQL 中一个非常有用的命令,它可以帮助数据库管理员查看当前 MySQL 实例中所有正在进行的连接和线程的状态。这对于监控数据库性能、排查问题以及确保数据库安全都非常重要。
使用show processlistSQL语句即可查看当前连接MySQL的用户。比如:
show processlist;
下面是对 SHOW PROCESSLIST 输出中各列含义的详细解释:
- Id 列:这是一个唯一的标识符,用于标识每个连接或线程。管理员可以使用 KILL id 命令来终止指定 id 的线程。例如,KILL 12345 会终止 id 为 12345 的线程。
- User 列:显示当前连接的用户名。如果不是以 root 用户身份运行 SHOW PROCESSLIST,则只显示当前用户有权限查看的连接。
- Host 列:显示连接是从哪个 IP 地址和端口发起的。这对于追踪问题连接的用户非常有用,尤其是在处理来自未知或不受信任来源的连接时。
- db 列:显示当前连接正在操作的数据库名称。如果没有指定数据库,则该值为 NULL。
- Command 列:显示当前连接正在执行的命令类型。常见的命令类型包括 Sleep(休眠)、Query(查询)、Connect(连接)等。
- Time 列:表示该线程处于当前状态的时间长度,单位是秒。高值可能表明存在性能问题或长时间运行的查询。
- State 列:显示当前连接执行 SQL 语句的具体状态。这可以提供关于线程正在做什么的更多详细信息,例如是否正在等待锁、正在排序结果等。
- Info 列:一般记录线程正在执行的 SQL 语句。默认只显示前 100 个字符。要查看完整的 SQL 语句,可以使用 SHOW FULL PROCESSLIST 命令。
使用 SHOW PROCESSLIST 的场景包括:
- 监控数据库性能:通过查看正在执行的查询和它们的状态,可以识别性能瓶颈。
- 排查问题:当数据库响应缓慢或出现问题时,可以查看哪些查询正在运行以及它们的状态。
- 确保数据库安全:通过检查连接的用户和来源,可以识别出可能的未授权访问尝试。
show processlist可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登录的,那么很有可能你的数据库被人入侵了,以后如果发现自己的数据库比较慢时,可以用这个SQL来查看数据库连接情况。