库的操作【MySQL】

文章目录

  • 创建数据库
  • 字符集和校验规则
    • 概念
    • 分类
    • 例子
  • 查看数据库
  • 显示创建语句
  • 修改数据库
  • 删除数据库
  • 备份和恢复
    • 备份
    • 恢复

创建数据库

SQL:

CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSET=charset_name] [[DEFAULT] COLLATE=collation_name];

其中,大写的单词是关键字,使用时可以不大写, MySQL 会进行语法优化(本系列主要用小写,一是方便,二是可读性较好);[] 中表示可选项;SQL 必须以;结尾

  • CHARSET:指定数据库采用的编码格式。
  • COLLATE:指定数据库采用的校验规则。

如果在创建数据库时未制定编码格式或校验规则,MySQL 则使用配置文件中对应的默认选项。

直接创建名为test_db1的数据库,不指定其他属性:

mysql> create database test_db1;
Query OK, 1 row affected (0.00 sec)

创建数据库后,可以用USE <database_name>来打开数据库(实际上是进入这个数据库所在的目录)。

字符集和校验规则

概念

在 MySQL 中,字符集和校验规则决定了 MySQL 如何存储和比较字符串。简单地说:

  • 字符集是一套字符与编码的映射集合,字符集就是编码文字的格式,和语言有关,它决定了 MySQL 如何存储和显示字符串;
  • 校验规则是一套字符之间的比较规则,它决定了 MySQL 如何排序和比较字符串。校验规则会影响到 ORDER BY 语句的顺序,会影响到 WHERE 条件中大于小于号筛选出来的结果,会影响 DISTINCT、GROUP BY、HAVING 语句的查询结果。

不同的语言和场景可能需要不同的字符集和校验规则,所以 MySQL 允许用户自己选择或者指定。不同的字符集和校验规则会影响 MySQL 的性能和兼容性。

如果把字符集和校验规则比作是一本字典,那么:

  • 字符集就是字典里面的字母表,它告诉你每个字母对应的编码是什么。
  • 校验规则就是字典里面的排序规则,它告诉你如何按照字母顺序排列单词。

不同的语言可能有不同的字母表和排序规则,所以你需要选择合适的字典来查阅或者编写文字。

分类

字符集可以分为单字节字符集和多字节字符集,例如 ASCII、Latin1、GB18030、UTF8 等。每种字符集都有一个或多个校验规则,例如 utf8_general_ci、utf8mb4_0900_ai_ci 等。校验规则的命名通常遵循以下约定:

  • 以字符集名开头,如 utf8、gbk 等。
  • 以国家名或 general 居中,如 chinese、swedish、general 等。
  • 以 ci、cs 或 bin 结尾,分别表示大小写不敏感(case insensitive)、大小写敏感(case sensitive)或按二进制比较。

不同的校验规则有不同的性能和准确性,一般来说,以 _unicode_ci 结尾的校验规则比以 _general_ci 结尾的校验规则更准确,但也更慢。以 _bin 结尾的校验规则是按照编码值比较,所以是大小写敏感的。

MySQL 中可以为不同的层次设置字符集和校验规则,例如服务器层、数据库层、表层和列层。可以通过SHOW VARIABLES LIKE 'character_set_database'SHOW VARIABLES LIKE 'collation_set_database' 命令查看当前 MySQL 使用的字符集和校验规则。如果要修改某个层次的字符集或校验规则,可以使用 ALTER 命令或者在创建时指定。

例如查看test_db1的字符集和校验规则:

mysql> USE test_db1; # 进入数据库
mysql> SHOW VARIABLES LIKE 'character_set_database';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.00 sec)mysql> SHOW VARIABLES LIKE 'collation_set_database';
Empty set (0.00 sec)

注意,如果不使用USE关键字进入数据库test_db1,查看的就是 MySQL 默认的字符集或校验规则。

由于在创建时没有指定校验规则,所以这个数据库的校验规则是空,也就是没有默认的校验规则。

为什么 MySQL 没有默认的校验规则?每一个字符集都有一个或多个校验规则?

MySQL 没有默认的校验规则是因为不同的字符集和场景可能需要不同的校验规则,所以 MySQL 允许用户自己选择或者指定校验规则。校验规则会影响到字符串的存储、排序、比较和索引等操作,所以用户需要根据自己的需求来选择合适的校验规则。

例如,如果用户需要存储多种语言的字符串,或者需要区分大小写和重音等细节,那么可以选择 utf8mb4_unicode_ci 这样的校验规则。如果用户只需要存储中文或者英文,或者不关心大小写和重音等细节,那么可以选择 utf8mb4_general_ci 这样的校验规则。不同的校验规则会有不同的性能和准确性,所以用户需要权衡利弊,选择最适合自己的校验规则。

如果用户没有指定校验规则,那么 MySQL 会使用字符集对应的默认校验规则。例如在 MySQL5.7 中,utf8 字符集对应的默认校验规则是 utf8_general_ci。这样可以保证字符集和校验规则之间的一致性,避免出现乱码或者错误的比较结果。

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

image-20231021204414068 image-20231021204442691

例子

有字符集(编码格式)我可以理解,毕竟不同语言需要不同的格式,这样才不会显示乱码。但是校验规则存在的意义在哪里呢?

在演示例子之前,我们再用 摩尔斯电码 来类比:摩尔斯电码用点和划的不同组合,来表示 A~Z 这 26 个字母,从而实现非文字通信。那么发送和接收信息的过程,都需要按照这同一套规则来编码和解码。数据库在很多时候都是作为查询使用的,那么在查询时,实际上也是通过“对比”这个操作来查找的。如果查询的规则和写入的规则不一样,就算有这条数据,也无法找到。

上文提到,每个字符集都有一个或多个校验规则,这么做的原因是一种语言可能有不同的形式,以起到不同的作用。

下面以 utf8_general_ci 校验规则来创建一个person_test1数据库,并创建一个person1表:

# 创建数据库
mysql> create database person_test1 collate=utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
# 进入数据库
mysql> use person_test1;
Database changed
# 创建表
mysql> create table person1(-> name varchar(20)-> );
Query OK, 0 rows affected (0.02 sec)
# 插入两行数据
mysql> insert into person1 values ('AAAAA');
Query OK, 1 row affected (0.01 sec)mysql> insert into person1 values ('aaaaa');
Query OK, 1 row affected (0.00 sec)
# 输出表中的内容
mysql> select * from person1;
+-------+
| name  |
+-------+
| AAAAA |
| aaaaa |
+-------+
2 rows in set (0.00 sec)

查找名为aaaaa或者AAAAA的数据:

mysql> select * from person1 where name='aaaaa';
+-------+
| name  |
+-------+
| AAAAA |
| aaaaa |
+-------+
2 rows in set (0.00 sec)mysql> select * from person1 where name='AAAAA';
+-------+
| name  |
+-------+
| AAAAA |
| aaaaa |
+-------+
2 rows in set (0.00 sec)

由此可见,utf8_general_ci 不是大小写敏感的。可以用同样的方式创建数据库person_test2测试,utf8_general_cs 是大小写敏感的。

用这个语句查看某个数据库中某个表的字符集和比较规则:

select table_schema, table_name, table_collation from information_schema.tables where table_schema ='person_test1'and table_name='person1';
+--------------+------------+-----------------+
| table_schema | table_name | table_collation |
+--------------+------------+-----------------+
| person_test1 | person1    | utf8_general_ci |
+--------------+------------+-----------------+
1 row in set (0.00 sec)

同样地,以 utf8_bin 校验规则来创建一个person_test3数据库,并创建一个person3表:

mysql> create database person_test3 collate=utf8_bin;
Query OK, 1 row affected (0.00 sec)mysql> use person_test3;
Database changed
mysql> create table person1( name varchar(20) );
Query OK, 0 rows affected (0.02 sec)mysql> insert into person1 values ('aaaaa');
Query OK, 1 row affected (0.00 sec)mysql> insert into person1 values ('AAAAA');
Query OK, 1 row affected (0.00 sec)mysql> select * from person1;
+-------+
| name  |
+-------+
| aaaaa |
| AAAAA |
+-------+
2 rows in set (0.00 sec)mysql> select * from person1 where name='AAAAA';
+-------+
| name  |
+-------+
| AAAAA |
+-------+
1 row in set (0.00 sec)mysql> select * from person1 where name='aaaaa';
+-------+
| name  |
+-------+
| aaaaa |
+-------+
1 row in set (0.00 sec)

由此可见,utf8_bin 不是大小写敏感的,因为它按照二进制比较。

查看数据库

使用:

show databases;

来查看当前 MySQL 服务器中的所有数据库:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| person_test1       |
| person_test2       |
| person_test3       |
| sys                |
| test_db1           |
+--------------------+
8 rows in set (0.00 sec)

显示创建语句

show create database <database_name>;

在前面增加show关键字,可以查看数据库是如何执行 SQL 来创建数据库的。

image-20231021224654599

虽然我们输入时是用小写的关键字,但是 MySQL 会自动对用户输入的 SQL 做语法优化,将小写的关键字用大写字母代替,而且数据库的名字会用`(反引号,在 esc 下面)来包含,这么做是方式数据库的名称和关键字冲突。

另外,如果用户输入的 SQL 由多行组成,MySQL 会将;之前的所有字段合并为一句。

例如上面在创建表时,为了可读性,用了多行输入,但 MySQL 会优化如下:

image-20231021225313795

另外,MySQL 也有记忆指令的功能:

image-20231021225242469

注意,/*!40100 DEFAULT CHARACTER SET utf8 */不是注释,它表示当前 MySQL 版本如果大于 4.10,则执行后面的 SQL 语句。

MySQL 客户端会阻塞当前会话,如果不想新建会话的同时使用系统的命令行,可以在命令行指令前加system,例如:

system clear # 清屏
system ls -l

修改数据库

SQL:

ALTER DATABASE db_name [[DEFAULT] CHARSET=character_name] [[DEFAULT] COLLATE=collation_name];

对数据库修改的内容主要是字符集和校验规则。

例如,将person_test1数据库的字符集改成 gbk,校验规则改为 gbk_bin:

image-20231021231421456

删除数据库

SQL:

DROP DATABASE [IF EXISTS] db_name;

创建一个数据库:

mysql> create database delete_test;mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| delete_test        |
| mysql              |
| performance_schema |
| person_test1       |
| person_test2       |
| person_test3       |
| sys                |
| test_db1           |
+--------------------+
9 rows in set (0.00 sec)

image-20231021234835215

删除它:

mysql> drop database delete_test;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| person_test1       |
| person_test2       |
| person_test3       |
| sys                |
| test_db1           |
+--------------------+
8 rows in set (0.00 sec)

当删除这个数据库后,这个路径下的同名目录也会被删除,即使里面有表。

备份和恢复

备份

命令行:

mysqldump -P 端口号 -u 用户名 -p 密码 -B 数据库名 1 数据库名 2 ...  > 数据库备份存储的文件路径

创建一个数据库,并在里面创建两个表:

mysql> create database backup_test;
Query OK, 1 row affected (0.00 sec)mysql> use backup_test;
Database changed
mysql> create table teacher(-> age int,-> name varchar(20)-> );
Query OK, 0 rows affected (0.01 sec)mysql> create table student(-> age int,-> name varchar(20)-> );
Query OK, 0 rows affected (0.01 sec)

在这两个表中分别插入两条记录:

mysql> insert into teacher values (24, '李老师');
Query OK, 1 row affected (0.01 sec)mysql> insert into teacher values (34, '王老师')
Query OK, 1 row affected (0.00 sec)mysql> insert into student values (13, '小明');
Query OK, 1 row affected (0.00 sec)mysql> insert into student values (12, '小陈');
Query OK, 1 row affected (0.00 sec)
image-20231022000031989

在 Linux 命令行中(MySQL 是我创建的一个目录):

[root@xy MySQL]# mysqldump -P3306 -uroot -p -B backup_test > back.sql

这个文件保存了对数据库和表的所有 SQL 操作以及数据本身,并且是做了优化的:
image-20231022000808169

恢复

SQL:

source 数据库备份存储的文件路径

为了方便演示,将原来的数据库删除,然后再恢复。

mysql> source /home/xy/MySQL/back.sql;
image-20231022001255857

这样数据库中的所有内容都恢复了。

由此可见,数据库的备份就是将 MySQL 之前优化并记录的 SQL 语句拷贝一份;恢复就是将这些 SQL 语句交给 MySQL 服务器重新执行一遍。

注意,备份是服务端做的,而恢复是在客户端做的。

备份表的操作也是一样的,只不过需要在需要恢复的数据库中操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166235.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 18.04 开机自启 打开终端执行脚本

一 打开设置开机自启配置程序 alt F2 输入 gnome-session-properties 或 终端输入 gnome-session-properties 二 添加开机自启配置 点右方的add加入 填写名称&#xff0c;可自定义 填写指令&#xff0c;即开机想要执行的指令 gnome-terminal -x bash -c “ls; exec bash” …

SpringBoot(二)集成 Quartz:2.5.4

Quartz是一个广泛使用的开源任务调度框架&#xff0c;用于在Java应用程序中执行定时任务和周期性任务。它提供了强大的调度功能&#xff0c;允许您计划、管理和执行各种任务&#xff0c;从简单的任务到复杂的任务。 以下是Quartz的一些关键特点和功能&#xff1a; 灵活的调度器…

Oracle的立场:官网更换首页与以色列站在一起

Oracle公司的官网&#xff0c;更换了首页内容&#xff0c;明确表明立场&#xff1a;Oracle与以色列站在一起。 声明指出&#xff1a; Oracle谴责针对以色列及其公民的恐怖袭击。Oracle将为其员工、以色列政府和国防机构提供一切必要的支持。 Magen David Adom是一家为以色列公民…

Android屏幕刷新机制

基础知识 CPU运行在Android设备上的中央处理器&#xff08;Central Processing Unit&#xff09;是Android设备的核心组件之一&#xff0c;负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构&#xff0c;如ARM Cortex-A系列处理器。这些处理器具有高性能…

Hadoop3教程(三十三):(生产调优篇)慢磁盘监控与小文件归档

文章目录 &#xff08;161&#xff09;慢磁盘监控&#xff08;162&#xff09;小文件归档小文件过多的问题如何对小文件进行归档 参考文献 &#xff08;161&#xff09;慢磁盘监控 慢磁盘&#xff0c;是指写入数据时特别慢的一类磁盘。这种磁盘并不少见&#xff0c;当机器运行…

Java学习笔记(五)——数组、排序和查找

一、数组 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。即数组就是一组数据。 &#xff08;一&#xff09;数组的使用 1、使用方式1——动态初始化 &#xff08;1&#xff09;数组的定义&#xff1a; 数据类型 数组名[] new 数据类型…

【C语言】每日一题(添加逗号)

添加逗号&#xff0c;链接奉上 目录 方法1&#xff1a;整体存入思路&#xff1a;代码实现&#xff1a; 方法2&#xff1a;分段输出思路&#xff1a;代码实现&#xff1a; 方法1&#xff1a;整体存入 思路&#xff1a; 整体思路&#xff1a; 我们发现这个整数N对于最后1位是比…

会声会影2023官方破解版激活码

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。功能最全的2023新版&#xff0c;全新视差转…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 &#xff08;164&#xff09;MR跑得慢的原因&#xff08;165&#xff09;MR常用调优参数Map阶段Reduce阶段 &#xff08;166&#xff09;MR数据倾斜问题参考文献 &#xff08;164&#xff09;MR跑得慢的原因 MR程序执行效率的瓶颈&#xff0c;或者说当你觉得你的MR程…

《动手学深度学习 Pytorch版》 9.4 双向循环神经网络

之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模&#xff0c;然而也存在需要后文预测前文的情况。 9.4.1 隐马尔可夫模型中的动态规划 数学推导太复杂了&#xff0c;略。 9.4.2 双向模型 双向循环神经网络&#xff08;bidirectional RNNs&#xff09;…

解决windows10、windows11故障:Microsoft-Windows-Kernel-Processor-Power 事件ID:37

一、现象 windows系统日志中出现大量的“Microsoft-Windows-Kernel-Processor-Power”错误。 经过分析&#xff1a;原因是windows配置的【使用电池】默认值是5%&#xff0c;按5%计算出来的功率与CPU的最小功率不兼容&#xff0c;如&#xff1a;本机CPU最高功率是25W&#xff0…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类&#xff0c;本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点&#xff1a; 几乎可以精确一次的输出&#xf…

数据库MongoDB

MongoDB记录是一个文档&#xff0c;由一个字段和值对组成的数据结构&#xff0c;文档类似于JSON对象。 一个文档认为就是一个对象&#xff0c;字段的数据类型是字符型&#xff0c;值除了使用基本类型外&#xff0c;还可以包括其他文档&#xff0c;普通数组和文档数组。 一、…

FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6

一、FreeRTOS 介绍 什么是 FreeRTOS &#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;Fr…

[翻译]理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要

理解Postgres的IOPS&#xff1a;为什么数据即使都在内存&#xff0c;IOPS也非常重要 磁盘IOPS&#xff08;每秒输入/输出操作数&#xff09;是衡量磁盘系统性能的关键指标。代表每秒可以执行的读写操作数量。对于严重依赖于磁盘访问的PG来说&#xff0c;了解和优化磁盘IOPS对实…

虹科分享 | 赋能物流机器人:CANopen通信如何发挥重要作用?

现代物流领域迅速融入了技术进步&#xff0c;特别是随着自主机器人的兴起&#xff0c;这一趋势越发明显。确保这些机器人在复杂的仓库环境中精确运行的一个关键方面是CANopen通信协议。该协议集成了各种组件&#xff08;电机、传感器、摄像头和先进的电池系统&#xff09;&…

flask入门(四)前后端数据传输

文章目录 1、flask后端接收来自前端的数据1&#xff09;如果前端提交的方法为POST2&#xff09;如果前段提交的方法是GET 2、flask后端向前端传数据3、案例参考文献 1、flask后端接收来自前端的数据 1&#xff09;如果前端提交的方法为POST 后端接收时的代码&#xff1a; xx…

C#使用PPT组件的CreateVideo方法生成视频

目录 需求 实现 CreateVideo方法 关键代码 CreateVideoStatus 其它 需求 我们在使用PowerPoint文档时&#xff0c;经常会使用其导出功能以创建视频&#xff0c;如下图&#xff1a; 手工操作下&#xff0c;在制作好PPT文件后&#xff0c;点击文件 -> 导出 -> 创建视…

云安全—分布式基础

0x00 前言 云必然是依赖于分布式技术来进行实现的&#xff0c;所以有必要学习和来了解分布式相关的内容 0x01 分布式计算 1.基本概述 分布式计算的定义&#xff1a;通过网络互联的计算机都具有一定的计算能力&#xff0c;他们之间互相传递数据&#xff0c;实现信息共享&…

互联网Java工程师面试题·Java 面试篇·第三弹

目录 39、JRE、JDK、JVM 及 JIT 之间有什么不同&#xff1f; 40、解释 Java 堆空间及 GC&#xff1f; 41、你能保证 GC 执行吗&#xff1f; 42、怎么获取 Java 程序使用的内存&#xff1f;堆使用的百分比&#xff1f; 43、Java 中堆和栈有什么区别&#xff1f; 44、“ab”…