MySQL数据库之数据库基础

文章目录

    • 一、数据库基础
      • 1.1 数据库基础
        • 1.1.1 关系型数据库
        • 1.1.2 非关系型数据库
        • 1.1.3 关系Vs非关系
        • 1.1.4 MYSQL主流分支
        • 1.1.5 索引
        • 1.1.6 锁
      • 1.2 安装
        • 1.2.1 源码编译安装
        • 1.2.2 二进制安装
        • 1.2.3 apt-get/yum安装
        • 1.2.4 三种安装方法优缺点比较
      • 1.3 操作数据库
        • 1.3.1 mysql
        • 1.3.2 mysqladmin
        • 1.3.3 修改密码的几种方法
        • 1.3.4 其他命令
      • 1.4 SQL
        • 1.4.1 DDL
        • 1.4.2 DML
        • 1.4.3 DCL
      • 1.5 字符乱码问题
        • 1.5.1 查看当前mysql的关于字符集变量
        • 1.5.2 修改字符集
        • 1.5.3 实验:模拟将latin1数据库修改成utf8字符集的过程

一、数据库基础

 

1.1 数据库基础

数据库分类

简述关系型数据库和菲关系型数据库:https://www.jianshu.com/p/fd7b422d5f93

数据库排名:https://db-engines.com/en/ranking

 
 

1.1.1 关系型数据库

1.定义
采用了关系模型来组织数据的数据库

 

2.常用概念

  • 关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名
  • 元组:可以理解为二维表中的一行,在数据库中经常被称为记录
  • 属性:可以理解为二维表中的一列,在数据库中经常被称为字段
  • 域:属性的取值范围,也就是数据库中某一列的取值限制
  • 关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
  • 关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, … … ,属性N),在数据库中称为表结构

 
3.关系型数据库优点

  • 容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
  • 使用方便:通用的SQL语言使得操作关系型数据库非常方便
  • 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率

 
4.关系型数据库瓶颈

  • 高并发读写需求
    网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
  • 海量数据的高效率读写
    网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的
  • 高扩展性和可用性
    在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。

 

5.特性

  • 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。

  • 数据库事务必须具备ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。

    数据库事务的4大特性ACID

    原子性(Atomicity)

    • 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    一致性(Consistency)

    • 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
    • 拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

    隔离性(Isolation)

    • 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    • 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

    持久性(Durability)

    • 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
  • 读写实时性

    对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后才看到这条动态是完全可以接受的

  • 复杂SQL,特别是多表关联查询

    任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品阶级角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能极大的弱化了

 

6.事务的隔离级别

隔离级别:https://blog.csdn.net/dengjili/article/details/82468576

 

脏读

  • 指一个事务读取了另外一个事务未提交的数据。

不可重复读

  • 在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

虚读(幻读)

  • 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
    (一般是行影响,多了一行)

 
 
7.Mysql体系结构

体系结构:https://blog.csdn.net/q402057192/article/details/87689739

MySQL数据库之数据库基础_第1张图片

可以看出MySQL最上层是连接组件。下面服务器是由连接池管理工具和服务SQL接口解析器优化器缓存存储引擎文件系统组成。

  • Connectors指的是不同语言中与SQL的交互;
  • Management Serveices & Utilities: 系统管理和控制工具,例如备份恢复、Mysql复制、集群等
  • Connection Pool: 连接池、管理缓冲用户连接,线程处理等需要缓存的需求;由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
  • SQL Interface: SQL接口。接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
  • Parser: 解析器、SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
  • Optimizer: 查询优化器、SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。
    • 用一个例子就可以理解: select uid,name from user where gender = 1;
    • 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
    • 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
    • 将这两个查询条件联接起来生成最终查询结果
  • Cache和Buffer: 查询缓存
    • 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
    • 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
  • Engine :存储引擎
    • 存储引擎是MySql中具体的与文件打交道的子系统。
    • 默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。表级锁定
    • InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。

注:lex和yacc

yacc是一个语法分析程序的自动产生器,严格地说Lex也是一个形式语言的语法分析程序的自动产生器。不过Lex所能处理的语言仅限于正规语言,而高级语言的词法结构恰好可用正规式表示,因此Lex只是一个词法分析程序的产生器。yace可以处理能用LALR(1)文法表示的上下文无关语言。而且我们将会看到yace具有一定的解决语法的二义性的功能。

具体:可以看《lex与yacc》这一本书

 
 

8.MySQL内存结构

MySQL中内存大致分为:全局内存(Global buffer)线程内存(Thread buffer) 两大部分。

MySQL数据库之数据库基础_第2张图片

全局内存:缓冲池里面有数据缓存、索引缓存、锁信息、插入缓存等等。此外还有重做日志缓存、额外的内存池。
线程内存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。

CheckPoint技术缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟。因此更新或者删除的时候直接操作的是内存的数据,先写入重做日志,然后再修改内存池里面的数据,最后定时刷新到磁盘上。

 
 

9.MySQL文件结构

(1) 参数文件:启动MySQL实例的时候,指定一些初始化参数,比如:缓冲池大小、数据库文件路径、用户名密码等。

(2) 日志文件:比如:错误日志、二进制日志、慢查询日志、查询日志等等。

通过show variables like "error_log"来查看错误日志存放内容。

通过show variables like "long_query_time"来查看慢查询日志记录的阈值。默认的慢查询日志的阀值是10秒,也就是查询时长超过10秒就会记录到慢查询日志文件;

(3) socket文件:当用UNIX域套接字方式进行连接的时候需要的文件。
(4) pid文件:MySQL实例的进程ID文件。
(5) 表结构文件:用来存放MySQL表结构定义文件。

.frm后缀命名的文件都是表结构文件,和存储引擎类型无关。所有的表都会生成一个.frm文件;
(6) 存储引擎文件:存储引擎正在存储了记录和索引等数据。

  • 1)共享表空间:共享表空间文件以.ibdata*来命名; 共享表空间下,innodb所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。
    共享表空间主要存放double write、undo log(undo log没有独立的表空间,需要存放在共享表空间)
  • 2)独立表空间:每个表拥有自己独立的表空间用来存储数据和索引
  • 3)查看数据库是否启用独立表空间:
    show variables like ‘innodb_file_per_table’;查看,innodb_file_per_table=ON,表示启用了独立表空间;
  • 4)使用独立表空间的优点
    如果使用软链接将大表分配到不同的分区上,易于管理数据文件
    易于监控解决IO资源使用的问题;
    易于修复和恢复损坏的数据;
    相互独立的,不会影响其他innodb表;
    导出导入只针对单个表,而不是整个共享表空间;
    解决单个文件大小的限制;
    对于大量的delete操作,更易于回收磁盘空间;
    碎片较少,易于整理optimize table;
    易于安全审计;
    易于备份
    如果在innodb表已创建后设置innodb_file_per_table,那么数据将不会迁移到单独的表空间上,而是续集使用之前的共享表空间。只有新创建的表才会分离到自己的表空间文件。
  • 5)共享表空间的数据文件配置:
    innodb_data_file_path参数:设置innoDB共享表空间数据文件的名字和大小,例如innodb_data_file_path=ibdata1:12M:autoextend(初始大小12M,不足自增)
    innodb_data_home_dir参数:innodb引擎的共享表空间数据文件的存放目录
    目前主要是使用独立表空间,但是共享表空间也是需要的,共享表空间主要存放double write、undo log等

 
 

10.InnoDB表存储结构

MySQL数据库之数据库基础_第3张图片

  • 表空间:表空间可看做是InnoDB存储引擎逻辑结构的最高层
  • 段:表空间由各个段组成,常见的段有数据段、索引段、回滚段等
  • 区:由64个连续的页组成,每个页大小为16kb ,即每个区大小为1MB
  • 页:每页16kb ,且不能更改。常见的页类型有: 数据页、Undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页
  • 行: InnoDB存储引擎是面向行的(row- oriented) , 每页最多允许存放7992行数据
    • (1)每页=16Kb(页类型:数据页、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页)
    • (2)区=64个连续的页=64*16Kb=1MB

 
 
11.MySQL存储引擎

  • 存储引擎

  • 区别

    1、事务的支持不同
    innodb支持事务
    myisam不支持事务
    2、锁粒度
    innodb行锁
    myisam表锁
    3、存储空间
    innodb既缓存索引文件又缓存数据文件
    myisam只能缓存索引文件
    4、存储结构
    (myisam:数据文件的扩展名为.MYD myData ,索引文件的扩展名是.MYI myIndex)
    (innodb:所有的表都保存在同一个数据文件里面 即为.Ibd)
    5、统计记录行数
    (myisam:保存有表的总行数,select count() from table;会直接取出出该值)
    (innodb:没有保存表的总行数,select count() from table;就会遍历整个表,消耗相当大)

 
 

mysql的存储引擎包括:MyISAM、 InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。

特点 MYISAM BDB MEMORY INNODB ARCHIVE
存储限制 没有 没有 64TB 没有
事务安全 支持 支持
锁机制 表锁 页锁 表锁 行锁 行锁
B树索引 支持 支持 支持 支持
哈希索引 支持 支持
全文索引 支持
集群索引 支持
数据缓存 支持 支持
索引缓存 支持 支持 支持
数据可压缩 支持 支持
空间使用 N/A 非常低
内存使用 中等
批量插入的速度 非常高
支持外键 支持

 
 

1.1.2 非关系型数据库

  • 定义
    指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
    必须强调的是,数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库这员老将。
  • 分类
    面向高性能并发读写的key-value数据库
    key-value数据库的主要特点是具有极高的并发读写性能,Redis,Tokyo Cabinet,Flare就是这类的代表
    面向海量数据访问的面向文档数据库
    这类数据库的特点是,可以在海量的数据中快速的查询数据,典型代表为MongoDB以及CouchDB

四种重要的非关系型数据库

非关系数据库:https://www.cnblogs.com/ynyhl/p/9253025.html

 
1.Hbase

​ 列式存储以流的方式在列中存储所有的数据。对于任何记录,索引都可以快速地获取列上的数据;列式存储支持行检索,但这需要从每个列获取匹配的列值,并重新组成行。HBase(Hadoop Database)是一个高可靠性高性能面向列可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase是Google BigTable的开源实现,模仿并提供了基于Google文件系统的BigTable数据库的所有功能。HBase可以直接使用本地文件系统或者Hadoop作为数据存储方式,不过为了提高数据可靠性和系统的健壮性,发挥HBase处理大数据量等功能,需要使用Hadoop作为文件系统。HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务,主要用来存储非结构化和半结构化的松散数据。

Hbase中表的特点:大,稀疏,面向列

Hbase应用场景:抓取增量数据、内容服务、信息交换

 

2.Redis

Redis是一个key-value存储系统,key为字符串类型,只能通过key对value进行操作,支持的数据类型包括string、list、set、zset(有序集合)和hash。Redis支持主从同步,数据可以从主服务器向任意数量的从服务器上同步。

​ Redis事务允许一组命令在单一步骤中执行。事务有两个属性:在一个事务中的所有命令作为单个独立的操作顺序执行;Redis事务是原子的,原子意味着要么所有的命令都执行,要么都不执行。Redis 事务由指令 MULTI 发起的,之后传递需要在事务中和整个事务中,最后由 EXEC 命令执行所有命令的列表。

Redis应用场景:统计

 

3.MongodDB

一个基于分布式文件存储的开源数据库系统,为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key value)对组成。

MongodDB特点:面向集合存储,易存储对象类型的数据;模式自由;支持动态查询;支持完全索引,包含内部对象;支持查询;支持复制和故障恢复;使用高效的二进制数据存储,包括大型对象(如视频);自动处理碎片,以支持云计算层次的扩展性;支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言;文件存储格式为BSON(一种JSON的扩展);可通过网络访问。

MongodDB应用场景:网站数据;缓存;大尺寸,低价值的数据;高伸缩性的场景;用于对象及JSON 数据的存储。

 

4.Neo4j

​ 一个高性能的 NoSQL 图形数据库,把数据保存为图中的节点以及节点之间的关系。Neo4j 中两个最基本的概念是节点和边节点表示实体,边则表示实体之间的关系。节点和边都可以有自己的属性,不同实体通过各种不同的关系关联起来,形成复杂的对象图。

Neo4j 提供了在对象图上进行查找和遍历的功能:深度搜索、广度搜索。

Neo4j特点:完整的ACID支持;高可用性;轻易扩展到上亿级别的节点和关系;通过遍历工具高速检索数据;属性是由Key-Value键值对组成。

Neo4j应用场景:社交网络,歌曲信息,状态图

 
 
MySQL数据库之数据库基础_第4张图片

 
 

1.1.3 关系Vs非关系

1.非关系型数据库不需要表与表之间有联系。
2.非关系型数据库对事务没有需求,不需要严格的保证数据的一致性。
3.非关系型数据库追求的是高并发,高扩展性。

数据库 类型 特性 优点 缺点
关系型数据库 SQLite、Oracle、mysql 1、关系型数据库,是指采用了关系模型来组织 数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型, 而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写;
非关系型数据库 MongoDb、redis、HBase 1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好;

 
 

1.1.4 MYSQL主流分支

mysql主流分支:https://blog.csdn.net/xuheng8600/article/details/79947595

产品 价格 目标 主要功能 是否可投入生产?
Percona Server 免费 提供 XtraDB 存储引擎的包装器和其他分析工具 XtraDB
MariaDB 免费 扩展 MySQL 以包含 XtraDB 和其他性能改进 XtraDB
Drizzle 免费 提供比 MySQL 更强大的可扩展性和性能改进 高可用性

1.Drizzle

​ Drizzle是MySQL引擎的一次重大修改,它清除了一些表现不佳和不必要的功能,将很多代码重写,对它们进行了优化,甚至将所用语言从C换成了C++,以获得所需的代码。此外,Drizzle 并没有就此结束修改,该产品在设计时就考虑到了其目标市场,即具有大量内容的多核服务器、运行Linux的64位机器、云计算中使用的服务器、托管网站的服务器和每分钟接收数以万计点击率的服务器。

2.MARIABD

在这里插入图片描述

​ 与Percona产品非常类似,但是提供了更多底层代码更改,试图提供比标准 MySQL更多的性能改进。MariaDB直接利用来自Percona的XtraDB引擎,由于它们使用的是完全相同的引擎,因此每次使用存储引擎时没有显著的差别。此外,MariaDB提供了MySQL提供的标准存储引擎,即MyISAM和InnoDB。

3.PERCONA
MySQL数据库之数据库基础_第5张图片

​ 与内置的MySQL存储引擎相比,XtraDB提供了一些极大的改进,

可扩展性:处理更多事务;在强大的服务器上进行扩展
性能:使用了XtraDB的Percona Server速度非常快
可靠性:避免损坏,提供崩溃安全(crash-safe)复制
管理:在线备份,在线表格导入/导出
诊断:高级分析和检测
灵活性:可变的页面大小,改进的缓冲池管理

 
 

1.1.5 索引

索引进阶:https://blog.csdn.net/q402057192/article/details/87695498

1.索引是什么?有什么作用?

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B_TREE及其变种。索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。

 
2.索引的优缺点

优点:

  • 大大加快数据的检索速度,这也是创建索引的最主要的原因;
  • 加速表和表之间的连接;
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;

缺点:

  • 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度;

  • 空间方面:索引需要占物理空间。

 
3.为什么说B+tree比B 树更适合实际应用中操作系统的文件索引和数据库索引

  • B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针(红色部分),因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;
  • B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;
  • 数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

 

4.什么情况下设置了索引但无法使用?

  • 以“%(表示任意0个或多个字符)”开头的LIKE语句,模糊匹配;

  • OR语句前后没有同时使用索引;

  • 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型);

  • 对于多列索引,必须满足 最左匹配原则 (eg:多列索引col1、col2和col3,则 索引生效的情形包括 col1或col1,col2或col1,col2,col3)

 
5.什么样的字段适合创建索引?

  • 经常作查询选择的字段
  • 经常作表连接的字段
  • 经常出现在order by, group by, distinct 后面的字段

 
6.创建索引时需要注意什么?

  • 非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;
  • 取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高;
  • 索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高。

 
 

1.1.6 锁

1.锁的类型

  • 共享锁:也叫读锁,多个客户可以同时读取同一个资源,互不干扰。
  • 排它锁:也叫写锁,写锁的优先级高于读锁,当写锁被占用的时候,这个时候读也是会被等待的,其他客户写也会等待。

 

2.锁的粒度

  • 表锁:粒度比较粗,锁定整张表。
    特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
  • 行锁:行级锁可以最大程度的支撑并发处理,同时也带来了最大的锁开销。
    特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页锁:介于两者之间。

 

3.锁的实现

  • 悲观锁:悲观锁指对数据被意外修改持保守态度,依赖数据库原生支持的锁机制来保证当前事务处理的安全性,防止其他并发事务对目标数据的破坏或破坏其他并发事务数据,将在事务开始执行前或执行中申请锁定,执行完后再释放锁定。这对于长事务来讲,可能会严重影响系统的并发处理能力。 自带的数据库事务就是典型的悲观锁。
  • 乐观锁:乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。一般是加一个版本号字段 每次更新时候比较版本号。

 
4.什么是死锁?怎么解决?

死锁:两个或多个事务相互占用了对方的锁,就会一直处于等待锁的状态。

 
常见的解决死锁的方法:

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
如果业务处理不好可以用分布式事务锁或者使用乐观锁

 
 

1.2 安装

1.2.1 源码编译安装

安装依赖

1.登录ftp服务器下载lnmp_src目录

0.清除yum安装的mysql-server
	yum remove mysql-server mysql
	rm -rf /var/lib/mysql /etc/my.cnf
yum install gcc gcc-c++ automake  ncurses-devel

2.编译安装cmake

lftp 172.16.200.251
	mirror lnmp_src

3.编译mysql

[root@lnmp source]# tar -xzvf mysql-5.6.17.tar.gz 
[root@lnmp source]# cd mysql-5.6.17
[root@lnmp mysql-5.6.17]# cmake -DCMAKE_INTSALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/data/mysql -DENABLE_DOWNLOADS=1
[root@lnmp mysql-5.6.17]# make && make install

4.初始化mysql

拷贝服务控制脚本
	cp support-files/mysql.server  /etc/init.d/mysqld
	chmod +x  /etc/init.d/mysqld
进入安装目录
	cd /usr/local/mysql
修改数据目录和安装目录拥有者和所属组
	chown -R mysql.mysql /usr/local/mysql /data/mysql
运行初始化脚本(为了数据库初始化)
	/usr/local/mysql/scripts/mysql_install_db

5.启动mysql服务

/etc/init.d/mysqld restart

 

1.2.2 二进制安装

1.创建用户

[root@mysql ~]# useradd  -r  -s /sbin/nologin mysql

2.数据库目录创建

[root@mysql ~]# mkdir /data
[root@mysql ~]# mkdir /data/mysql/mysql3306/{data,logs,tmp} -p
[root@mysql ~]# chown -R mysql.mysql /data/mysql/mysql3306

查看

[root@mysql ~]# ll /data/mysql/mysql3306/
total 12
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 data
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 logs
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 tmp

3.软件的基本安装

下载

mysql 8.0

[root@mysql ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

mysql 5.7

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz

解压

[root@mysql ~]#mv ~/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz /opt/mysql8.0/
[root@mysql ~]# cd /opt/mysql8.0/
[root@mysql mysql8.0]#tar -xf  mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
[root@mysql ~]#cd /usr/local/
[root@mysql local]# ln -s /opt/mysql8.0/mysql-8.0.20-linux-glibc2.12-x86_64 mysql

4.配置文件准备

/etc/my.cnf

[client]
socket = /data/mysql/mysql3306/mysql.sock

[mysqld]
user = mysql
port = 3306
socket = /data/mysql/mysql3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
log-error = /data/mysql/mysql3306/logs/err.log
pid-file = /data/mysql/mysql3306/logs/mysql.pid
#log_slave_updates = 1
#log-bin = /data/mysql/3308/mysql-bin

配置文件加载顺序(每个文件若存在都会加载,新配置覆盖旧配置)

  • /etc/my.cnf
    server-id = 3306
  • /etc/mysql/my.cnf
    server-id = 3307
  • /usr/local/mysql/etc/my.cnf
    server-id = 3308
  • ~/my.cnf
    server-id = 3309

5.初始化MySQL

[root@mysql ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql

报错,下载libaio, yum install -y libaio-devel.x86_64

查看

[root@mysql local]# ll /data/mysql/mysql3306/
total 16
drwxr-xr-x 6 mysql mysql 4096 Jun 23 11:54 data
drwxr-xr-x 2 mysql mysql 4096 Jun 23 11:54 logs
srwxrwxrwx 1 mysql mysql    0 Jun 23 11:54 mysql.sock
-rw------- 1 mysql mysql    5 Jun 23 11:54 mysql.sock.lock
drwxr-xr-x 2 mysql mysql 4096 Jun 23 10:03 tmp

6.检查error log初始化是不是正常

tailf /data/mysql/mysql3306/logs/mysql-error.log

7.启动mysql服务

[root@mysql local]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
[1] 1413
[root@mysql local]# tail /data/mysql/mysql3306/logs/mysql.pid 
1413

# 该日志下有随机密码 A temporary password is generated for root@localhost: Y#et)OR9RPgU
[root@mysql local]# tail /data/mysql/mysql3306/logs/err.log
2020-06-23T15:54:57.089118Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.20'  socket: '/data/mysql/mysql3306/mysql.sock'  port: 3306  MySQL Community Server - GPL.
[root@mysql local]# mysql -u root -p
-bash: mysql: command not found
[root@mysql local]# /usr/local/mysql/bin/mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.20

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
	
# 修改密码

mysql> alter user user() identified by '123';
Query OK, 0 rows affected (0.01 sec)

service mysqld restart
systemctl restart mysqld
mysqld_safe --defaults-file=/etc/my.cnf &

添加服务

[root@mysql local]# cp -v /usr/local/mysql/support-files/mysql.server /etc/init.d/
‘/usr/local/mysql/support-files/mysql.server’ -> ‘/etc/init.d/mysql.server’
[root@mysql local]# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQLD
SourcePath=/etc/init.d/mysql
Before=shutdown.target

[Service]
User=mysql
Type=forking
ExecStart=/etc/init.d/mysql.server start
ExecReload=/etc/init.d/mysql.server restart
ExecStop=/etc/init.d/mysql.server stop

[Install]
WantedBy=multi-user.target

加入变量

export PATH=/usr/local/mysql/bin:$PATH

问题

生产环境应该使用哪一种方式启动,文件启动
生产环境要不要自动开机启动mysqld服务,最好不要

 

1.2.3 apt-get/yum安装

centos6
yum install mysql-server mysql
centos7
yum install mariadb-server mariadb

 
 

1.2.4 三种安装方法优缺点比较

rpm 二进制 源码
优点 安装简单,适合初学者学习使用 安装简单
可以安装在任何路径下,灵活性好
一台服务器可以安装多个mysql
在实际安装的操作系统进行可根据需要定制编译,最灵活
性能最好
一台服务器可以安装多个mysql
缺点 需要单独下载客户端和服务器
安装路径不灵活,默认路径不能修改,一台服务器只能安装一个mysql
已经经过编译,性能不如源码编译的好
不能灵活定制编译参数
安装过程较复杂
编译时间长
文件布局 /usr/bin
客户端程序和脚本
/usr/sbin
mysqld 服务器
/var/lib/mysql
日志文件,数据库
/usr/share/doc/packag
es 文档
/usr/include/mysql
包含(头)文件
/usr/lib/mysql

/usr/share/mysql
错误消息和字符集文件
/usr/share/sql-bench
基准程序
bin
客户端程序和 mysqld
服务器
data
日志文件,数据库
docs
文档,ChangeLog
include
包含(头)文件
lib

scripts
mysql_install_db
share/mysql 错误消息文件
sql-bench 基准程序
bin
客户端程序和脚本
include/mysql
包含(头)文件
info
Info 格式的文档
lib/mysql

libexec
mysqld 服务器
share/mysql
错误消息文件
sql-bench
基准程序和crash-me 测试
var
数据库和日志文件

 
 

1.3 操作数据库

1.3.1 mysql

  • 选项说明
    -u用户名
    -p[密码]
    -h主机名 默认localhost
    –protocol=tcp|socket 连接协议
    -P端口
    -S套接字文件路径
    -e “语句”

mysql -u root -h ‘localhost’ -p

mysql -u root -h ‘localhost’ -p -U

  • -U 如果sql语句不带where limit等关键字时,拒绝执行

mysql -u root -h ‘localhost’ -e “语句” -p;

  • 无交互式的执行sql语句

交互模式语句

  • show XXX;
    show databases;
    show tables;

  • SQL语句;
    select * from TB_NAME;

  • use DB;
    切换到数据库DB

  • system COMMAND
    执行shell中的命令

  • source *.sql
    执行*.sql文件中的SQL语句

  • show create database DB_NAME;
    查看建库语句

  • show create table TB_NAME;
    查看建表语句

  • show variables;
    查看mysql的所有内置变量

  • show variables like ‘character%’;
    查看character开头的变量
    set global VAR_NAME=VALUE;
    修改变量的值

  • show character set;
    查看所有字符集及校对规则

  • show status;
    查看当前会话的状态
    show global status; #全局的状态

  • show processlist;
    查看mysql的连接情况
    show full processlist; 完整的信息包括执行的语句

批处理模式 mysql -uroot -p < test.sql

 

1.3.2 mysqladmin

管理mysql服务器的接口(建库,删库,创建用户,开停服务)
mysqladmin [options] command [command-arg] [command [command-arg]] …
options 同mysql选项

  • command
    create database name 创建一个新数据库
    drop database name 删除一个数据库及其所有表
    extended-status 给出服务器的一个扩展状态消息
    flush-hosts 洗掉所有缓存的主机
    flush-logs 刷新所有日志
    flush-tables 刷新所有表
    flush-privileges 再次装载授权表(同reload)
    kill id,id,… 杀死mysql线程
    password 新口令,将老口令改为新口令
    ping 检查mysqld是否活着
    processlist 显示服务其中活跃线程列表
    reload 重启mysql服务
    refresh 洗掉所有表并关闭和打开日志文件
    shutdown 关掉服务器
    status 给出服务器的简短状态消息
    variables 打印出可用变量
    version 得到服务器的版本信息

 

1.3.3 修改密码的几种方法

第一种

SET PASSWORD FOR root@localhost =‘newpass’;

mysql> SET PASSWORD FOR root@localhost ='newpass';
Query OK, 0 rows affected (0.04 sec)

 

第二种

mysqladmin -u root password “newpass” -p

[root@mysql ~]# /usr/local/mysql/bin/mysqladmin -u root password  "123456" -p
Enter password: 
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

 

第三种

直接修改表

mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;

重载权限表

 

第四种

mysql初始化向导
mysql_secure_installation

[root@mysql ~]# /usr/local/mysql/bin/mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: 

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Using existing password for root.

Estimated strength of the password: 25 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

丢失root密码的情况
停止mysqld服务
mysqld_safe --skip-grant-tables &
mysql -u root mysql
use mysql
mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=‘root’;
mysql> FLUSH PRIVILEGES;

 

以上是5.7之前的版本,现在用的是8.0的版本,所以是有区别的。

mysql 8.0版本忘记密码:https://www.cnblogs.com/yaowen/p/9486997.html

实战

[root@mysql ~]# systemctl stop mysql
[root@mysql ~]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
[1] 907
[root@mysql ~]# 2020-06-30T12:51:29.519830Z mysqld_safe Logging to '/data/mysql/mysql3306/logs/err.log'.
2020-06-30T12:51:29.579482Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/mysql3306/data
/usr/local/mysql/bin/mysql -u root mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.20 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql
Database changed
mysql> update user set authentication_string = ' ' where user = 'root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

完成

登录进去修改密码

直接回车就行

[root@mysql ~]# /usr/local/mysql/bin/mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.20 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SET PASSWORD FOR root@localhost ='Newpass@123';
Query OK, 0 rows affected (0.01 sec)

 
 

1.3.4 其他命令

mysqld_safe
启动mysql服务端进程
mysqldump
备份数据库
mysqlbinlog
解析mysql的binlog日志

 

1.4 SQL

1.4.1 DDL

  • 功能

用于创建、删除、修改新库和新表,为表加入索引等

create

  • 创建数据库
    create database 数据库名(不能数字开头)

    举例

    • create database pldb;查看创建 show create database pldb\G
      默认字符集为latin1
    • create database pldb default charset gbk collate gbk_chinese_ci;
      设置字符集为gbk
    • create database pldb default charset utf8 collate general_utf8_ci;
      设置字符集为utf8
  • 创建表

    create table 表名 (字段名1 类型 其他,字段名2 类型 其他,…)

    举例

create database pldb;
use pldb
create table student(id int(4) not null,name char(20) not null,age tinyint(2) not null default '0',dept varchar(16) default null);
show create database pldb;
show create table student;
desc 表名;

Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.217.153
Master_User: master
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1370
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 322
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

  • 创建用户

    create user ‘alice’@‘localhost’ identified by ‘pass’;

  • 查看表结构

    desc 表名;

  • 为表中字段创建索引

    说明

    • 索引就像书的目录一样,如果在字段上建立了索引,那么以索引为查询条件时可以加快查询数据的速度,这是mysql优化的重要内容之一

    创建主键索引&普通索引

    • 每个表只能有一个主键索引列(内容唯一),可以有多个普通索引列(内容可以不唯一)

    • create table student(
          -> id int(4) not null auto_increment,auto_increment 自增
          -> name char(20) not null,
          -> age tinyint(2) not null default '0',
          -> dept varchar(16) default null
          -> primary key(id), 主键索引
      	-> key index_name(name),
      	-> );
      

      key index_name(name),

      • 普通索引格式: 索引名称(列名)

      • 添加普通索引 alter table student add index index_name(name);

      • 对字段前n个字符创建索引 create index index_dept on student(dept(8));

      • 为表的多个字段创建联合索引 create index index_name_dept on student(name,age);create index index_name_dept on student(name(8),dept(5));

      • 联合索引的生效特性

        • 组合索引的生效原则是 从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用

        • 例子:index(a,b,c) 对a,b,c做联合索引

        • where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;
          where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果
          where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;
          where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关
          

    查看索引 show index from student;

    删除索引 drop index 索引名 on 表名;

    常见问题

    • 1.既然建立索引可以加快条件查询过程,那需不需要为所有列建立索引呢?
      • 百行内小表无需索引
        索引占用系统空间
        索引需要维护
        更新多读取少的表少建索引
    • 2.建立索引应该在哪些列上建立
      • select user,password from user where user=xxx;
      • 尽量在唯一值多的大表上建立索引

drop

  • 删除库
    drop database 数据库名;
  • 删除表
    drop table 表名;

alter

  • 增删表的字段

    • alter table 表名 add 字段 类型 其他;first;after

    • 举例

      alter table student add sex char(6);
      	增加一个字段
      alter table student add sex char(4),add qq int(20);
      	增加两个字段
      alter table student change qq mail char(10);
      	改变字段
      alter table student modify mail char(20);
      	修改字段类型
      
  • 修改表名
    rename table 原表 to 新表;

 

1.4.2 DML

  • 功能
    用于添加、修改、删除、查询表中的数据

insert

  • insert into student(column_name,…) values(VALUE,…)

  • 举例

     insert into student values(4,'ponce',22,'CS');
    	不指定列的话值需要一一对应
     insert into student(name) values('alice');
    	插入一行数据
     insert into student(name) values('alice'),('bob');
    	插入多行数据
    

update

  • update 表名 set name=value where EXPRESSION;

  • 举例

    update student set name='gemi' where id=4;
    

delete

删除表中数据
delete from 表名 [where EXP];
truncate table 表名; 直接清空表内容

select

select 列名 from 表名 [where|limit|order by …];

  • 举例

    select user,password from user;
    select * from user where user=‘haha’;
    select * from user where user=‘haha’ and id=2;
    select * from user where id>2;
    select id,name from student where name='jack' or id=4;
    select id,name from student limit 2;
    select * from student order by id asc|desc;
    
  • explain 查询语句

 

1.4.3 DCL

数据控制语言,授权和撤权

grant

  • 授权本地用户管理数据库
    create user ‘alice’@‘localhost’ identified by ‘pass’;
    grant all on pldb.* to ‘alice’@‘localhost’;
    flush privileges;
  • 授权用户从远程管理数据库
    grant all on pldb.* to ‘alice’@’%’ identified by ‘pass’;
    flush privileges;
  • 查看用户授权信息
    show grants for ‘alice’@‘localhost’;

revoke

 
 

1.5 字符乱码问题

1.5.1 查看当前mysql的关于字符集变量

show variables like ‘character%’;

character_set_client     | latin1
	客户端编码方式
character_set_connection | latin1
	建立连接使用的编码
character_set_results    | latin1
	结果集的编码;
character_set_database   | latin1
	数据库的编码
character_set_filesystem | binary
	os上文件名转化成此字符集,默认binary是不做任何转换的
character_set_server     | latin1
	数据库服务器的编码
character_set_system     | utf8
	元数据的编码

查看:

mysql> show variables like 'character%';
+--------------------------+-------------------------------------------------------------------+
| Variable_name            | Value                                                             |
+--------------------------+-------------------------------------------------------------------+
| character_set_client     | utf8mb4                                                           |
| character_set_connection | utf8mb4                                                           |
| character_set_database   | utf8mb4                                                           |
| character_set_filesystem | binary                                                            |
| character_set_results    | utf8mb4                                                           |
| character_set_server     | utf8mb4                                                           |
| character_set_system     | utf8                                                              |
| character_sets_dir       | /opt/mysql8.0/mysql-8.0.20-linux-glibc2.12-x86_64/share/charsets/ |
+--------------------------+-------------------------------------------------------------------+
8 rows in set (0.02 sec)

 

1.5.2 修改字符集

1.可以通过set names utf8; 修改(在查询插入数据时设置或在sql文件中指定)

2.mysql -u root -p --deafult-character-set=utf8 pldb< xx.sql

3.修改my.cnf

[mysql]
default-character-set=utf8;
	mysql客户端字符集
[mysqld]
character_set_server=utf8
	mysql服务器字符集

 

1.5.3 实验:模拟将latin1数据库修改成utf8字符集的过程

1.导出表结构
mysqldump -uroot -p --default-character-set=latin1 -d DBNAME > X1.sql
-d 只备份表结构
–default-character-set=latin1 连接默认的字符集为latin1

[root@mysql ~]# /usr/local/mysql/bin/mysqldump -uroot -p --default-character-set=latin1 -d haha > test.sql
Enter password: 
[root@mysql ~]# ls
anaconda-ks.cfg         bashdb-5.0-1.1.2         L957-964TMP.html.gz
bashdb-4.4-0.94         bashdb-5.0-1.1.2.tar.gz  test.sql
bashdb-4.4-0.94.tar.gz  download

2.编辑test.sql将latin1改为utf8
ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

3.确保数据库没有数据写入,备份数据

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 DBNAME > X2.sql

--quick 一次一行检索数据并缓存
--no-create-info 不保存create语句
--extended-insert 讲多行insert语句合并为一行
--default-character-set=latin1 按原有字符集导出数据,不会导致导出中文乱码

[root@mysql ~]# /usr/local/mysql/bin/mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 haha > test2.sql

4.将test2.sql修改为set name utf8;
在最前面加入一行set names utf8;

5.建库
create database pldb default charset utf8;

mysql> create database hehedb default charset utf8;
Query OK, 1 row affected, 1 warning (0.01 sec)

6.导入库表
mysql -uroot -p pldb < test.sql
mysql -uroot -p pldb < test2.sql

[root@mysql ~]# /usr/local/mysql/bin/mysql -uroot -p hehedb < test.sql
Enter password:
[root@mysql ~]# /usr/local/mysql/bin/mysql -uroot -p hehedb < test2.sql 
Enter password: 

7.将mysql客户端和服务器端字符集改为utf8

修改my.cnf

[mysql]
default-character-set=utf8;
	mysql客户端字符集
[mysqld]
character_set_server=utf8
	mysql服务器字符集

8.重启mysql服务

mysql> use hehedb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from student;
+----+-------+-----+------+
| id | name  | age | dept |
+----+-------+-----+------+
|  1 | alice |  20 | CS   |
|  2 | bob   |  21 | CS   |
+----+-------+-----+------+
2 rows in set (0.00 sec)

此时字符集已变成utf8

mysql> show variables like 'character%';
+--------------------------+-------------------------------------------------------------------+
| Variable_name            | Value                                                             |
+--------------------------+-------------------------------------------------------------------+
| character_set_client     | utf8                                                              |
| character_set_connection | utf8                                                              |
| character_set_database   | utf8                                                              |
| character_set_filesystem | binary                                                            |
| character_set_results    | utf8                                                              |
| character_set_server     | utf8                                                              |
| character_set_system     | utf8                                                              |
| character_sets_dir       | /opt/mysql8.0/mysql-8.0.20-linux-glibc2.12-x86_64/share/charsets/ |
+--------------------------+-------------------------------------------------------------------+
8 rows in set (0.00 sec)

你可能感兴趣的:(#,Linux之mysql)