目录
- 数据库01 /Mysql初识以及基本命令操作
- 1.数据库介绍
- 1.1 相关概念
- 1.2 数据库
- 1.3数据库管理系统(DBMS)
- 1.4结构化查询语言(SQL)
- 2.一些常见问题的设置
- 2.1永久修改字符串编码的方法
- 2.2 如果root密码忘了怎么办
- 2.3 用户密码设置以及修改密码的三种方式
- 2.4其它注意点
- 3.数据库的优势
- 4.mysql的基本操作命令
- 4.1操作文件夹/库(增删改查)
- 4.2操作文件/表(增删改查)
- 4.3操作文件中的内容/记录(增删改查)
- 4.4 查看字符集编码的指令
- 4.5MySQL客户端连接服务端时的完整指令
- 5.储存引擎
- 6.事务
数据库01 /Mysql初识以及基本命令操作
1.数据库介绍
1.1 相关概念
#1.相关概念:
#数据库服务器:
# 一台机器,安装了数据库管理软件
#数据库管理系统:
# 软件
#库:
# 相当于文件夹
#表:
# 相当于文件
#记录:
# 表里边的内容
#2.分类:
# 关系型:每个字段之间的关系紧密,通过任何一个字段都可以查到该组数据
# 非关系型:只能通过key,去获取value
#1.相关概念:
#数据库服务器:
# 一台机器,安装了数据库管理软件
#数据库管理系统:
# 软件
#库:
# 相当于文件夹
#表:
# 相当于文件
#记录:
# 表里边的内容
#2.分类:
# 关系型:每个字段之间的关系紧密,通过任何一个字段都可以查到该组数据
# 非关系型:只能通过key,去获取value
1.2 数据库
#数据库:数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
#所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
#数据库:数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
#所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
1.3数据库管理系统(DBMS)
1.DBMS:数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。
2.RDBMS:关系型数据库,关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
# 1.MySQL
# MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
# 2.oracle数据库
# Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率数一数二 。Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商
# 主要应用范围:传统大企业、大公司、政府、金融、证券等。
# 版本升级:oracle8i,oracle9i,oracle10g,oracle11g,oracle12c
# 3.MariaDB数据库
# MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL授权许可。开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,因此MySQL开元社区采用分支的方式来避开这个风险。MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。
# 4.SQL Server数据库
# Microsoft SQL Server是微软公司开发的大型关系数据库系统。SQL Server的功能比较全面,效率高,可以作为中型企业或单位的数据库平台。SQL Server可以与Winodws操作系统紧密集成,不论是应用程序开发速度还是系统事务处理运行速度,都得到较大的提升,对于在Windows平台上开发的各种企业级信息管理系统来说,不论是C/S(客户机/服务器)架构还是B/S(浏览器/服务器)架构。SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行
# 5.Access数据库
# Access是入门级小型桌面数据库,性能安全性都很一般,可供个人管理或小型企业只用Access不是数据库语言,只是一个数据库程序
3.NoSQL:非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Olnly SQL”
指的是非关系型数据库,而不是“No SQL”的意思,因此,NoSQL的产生并不是要彻底地否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
#常见的非关系型数据库:
# 1.memcached(key-value):Memcaced是一个开源的、高性能的、具有分布式内存对象的缓存系统。通过它可以减轻数据库负载,加速动态的web应用
# 2.MongoDB:MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。
# 3.Cassandra:Apache Cassndra是一套开源分布式Key-Value存储系统。它最初由Facebook开发,用于存储特别大的数据。Facebook目前在使用此系统。
管理数据的工具有很多种,不止mysql一个。关于分类其实可以从各个纬度来进行划分,但是我们最常使用的分类还是根据他们存取数据的特点来划分的,主要分为关系型和非关系型。
可以简单的理解为,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构
关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用,但是不是完全相互通用
非关系型:mongodb,redis,memcache
1.DBMS:数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。
2.RDBMS:关系型数据库,关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
# 1.MySQL
# MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
# 2.oracle数据库
# Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率数一数二 。Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商
# 主要应用范围:传统大企业、大公司、政府、金融、证券等。
# 版本升级:oracle8i,oracle9i,oracle10g,oracle11g,oracle12c
# 3.MariaDB数据库
# MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL授权许可。开发这个MariaDB的原因之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,因此MySQL开元社区采用分支的方式来避开这个风险。MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。
# 4.SQL Server数据库
# Microsoft SQL Server是微软公司开发的大型关系数据库系统。SQL Server的功能比较全面,效率高,可以作为中型企业或单位的数据库平台。SQL Server可以与Winodws操作系统紧密集成,不论是应用程序开发速度还是系统事务处理运行速度,都得到较大的提升,对于在Windows平台上开发的各种企业级信息管理系统来说,不论是C/S(客户机/服务器)架构还是B/S(浏览器/服务器)架构。SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行
# 5.Access数据库
# Access是入门级小型桌面数据库,性能安全性都很一般,可供个人管理或小型企业只用Access不是数据库语言,只是一个数据库程序
3.NoSQL:非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Olnly SQL”
指的是非关系型数据库,而不是“No SQL”的意思,因此,NoSQL的产生并不是要彻底地否定关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。
#常见的非关系型数据库:
# 1.memcached(key-value):Memcaced是一个开源的、高性能的、具有分布式内存对象的缓存系统。通过它可以减轻数据库负载,加速动态的web应用
# 2.MongoDB:MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。
# 3.Cassandra:Apache Cassndra是一套开源分布式Key-Value存储系统。它最初由Facebook开发,用于存储特别大的数据。Facebook目前在使用此系统。
管理数据的工具有很多种,不止mysql一个。关于分类其实可以从各个纬度来进行划分,但是我们最常使用的分类还是根据他们存取数据的特点来划分的,主要分为关系型和非关系型。
可以简单的理解为,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构
关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用,但是不是完全相互通用
非关系型:mongodb,redis,memcache
1.4结构化查询语言(SQL)
SQL : 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统
# SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
# 1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
# 2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
# 3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
***不同数据库系统之间的SQL不能完全相互通用。
SQL : 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统
# SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
# 1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
# 2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
# 3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
***不同数据库系统之间的SQL不能完全相互通用。
2.一些常见问题的设置
2.1永久修改字符串编码的方法
1.在mysql安装目录下创建一个my.ini(my.cnf)文件,写入下面的配置,然后重启服务端
2.我们配置的用户名和密码,就叫做user和password,不能是username什么的,这个记住啦。
强调:配置文件中的注释可以有中文,但是配置项中不能出现中文
1.在mysql安装目录下创建一个my.ini(my.cnf)文件,写入下面的配置,然后重启服务端
2.我们配置的用户名和密码,就叫做user和password,不能是username什么的,这个记住啦。
强调:配置文件中的注释可以有中文,但是配置项中不能出现中文
[client]
#设置mysql客户端默认字符集
default-character-set=utf8
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
user = 'root'
password = '123'
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=E:\mysql-5.6.45-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:\mysql-5.6.45-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[client]
#设置mysql客户端默认字符集
default-character-set=utf8
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
user = 'root'
password = '123'
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=E:\mysql-5.6.45-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:\mysql-5.6.45-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
2.2 如果root密码忘了怎么办
1 关闭正在运行的MySQL服务
#net stop mysql(这个mysql是你添加的mysqld到系统服务时的服务名)
2. 打开DOS窗口,转到mysql\bin目录。
# 1.d:(回车)
# 2.cd mysql-5.6.45-winx64(回车)
# 3.cd bin(回车)
3. 输入mysqld --skip-grant-tables 回车。
#skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证,因为之所以mysql启动之后,客户端连接的时候需要登陆认证,输入密码什么的,是因为mysql服务端启动的时候,加载了自己内部的一些权限相关信息的授权表、权限认证表什么的,这样就要求客户端必须有认证,如果启动的时没有加载这些表和设置,那么我们客户端再进行登陆的时候,就不需要认证了
4 重新启动一个窗口,连接mysql服务端
5 修改mysql库里面的user表里面的root用户记录的密码:
password():mysql的内置函数
update user set password = password('666') where user='root';
6. 刷新权限(必须步骤):flush privileges; 凡是涉及到密码修改或者后面我们会学到的权限修改,修改完之后全部要再执行一下这一句
5 关掉mysqld服务端,指令:
tasklist|findstr mysqld
taskkill /F /PID 进程号
#注意:如果我们直接使用的上面这个指令,也即是mysqld --skip-grant-tables,也就是直接通过mysqld启动的mysql服务的话,我们就不能通过net stop mysql的方式来关闭mysql服务了。但是可以通过别的方式:杀进程的方式,在终端输入:tasklist |findstr mysqld找到这个mysqld服务的端口号,然后taskkill /F /PID 端口号(注意之间的空格)来杀死这个mysql服务的进行,以后就可以使用net start/stop mysql的方式来启动和关闭了。
6 正常启动服务端(net start mysql)
1 关闭正在运行的MySQL服务
#net stop mysql(这个mysql是你添加的mysqld到系统服务时的服务名)
2. 打开DOS窗口,转到mysql\bin目录。
# 1.d:(回车)
# 2.cd mysql-5.6.45-winx64(回车)
# 3.cd bin(回车)
3. 输入mysqld --skip-grant-tables 回车。
#skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证,因为之所以mysql启动之后,客户端连接的时候需要登陆认证,输入密码什么的,是因为mysql服务端启动的时候,加载了自己内部的一些权限相关信息的授权表、权限认证表什么的,这样就要求客户端必须有认证,如果启动的时没有加载这些表和设置,那么我们客户端再进行登陆的时候,就不需要认证了
4 重新启动一个窗口,连接mysql服务端
5 修改mysql库里面的user表里面的root用户记录的密码:
password():mysql的内置函数
update user set password = password('666') where user='root';
6. 刷新权限(必须步骤):flush privileges; 凡是涉及到密码修改或者后面我们会学到的权限修改,修改完之后全部要再执行一下这一句
5 关掉mysqld服务端,指令:
tasklist|findstr mysqld
taskkill /F /PID 进程号
#注意:如果我们直接使用的上面这个指令,也即是mysqld --skip-grant-tables,也就是直接通过mysqld启动的mysql服务的话,我们就不能通过net stop mysql的方式来关闭mysql服务了。但是可以通过别的方式:杀进程的方式,在终端输入:tasklist |findstr mysqld找到这个mysqld服务的端口号,然后taskkill /F /PID 端口号(注意之间的空格)来杀死这个mysql服务的进行,以后就可以使用net start/stop mysql的方式来启动和关闭了。
6 正常启动服务端(net start mysql)
2.3 用户密码设置以及修改密码的三种方式
方法1: 用SET PASSWORD命令
# 首先登录MySQL,使用mysql自带的那个客户端连接上mysql。
# 格式:mysql> set password for 用户名@localhost = password('新密码');
# 例子:mysql> set password for root@localhost = password('123');
方法2:用mysqladmin (因为我们将bin已经添加到环境变量了,这个mysqladmin也在bin目录下,所以可以直接使用这个mysqladmin功能,使用它来修改密码,不需要进入mysql里面去修改,不安全)
#关于mysqladmin的介绍:是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库、修改用户密码等等的功能,虽然mysqladmin的很多功能通过使用MySQL自带的mysql客户端可以搞定,但是有时候使用mysqladmin操作会比较简单。
# 格式:mysqladmin -u用户名 -p旧密码 password 新密码
# 例子:mysqladmin -uroot -p123456 password 123
方法3:用UPDATE直接编辑那个自动的mysql库中的user表
#首先登录MySQL,连接上mysql服务端。
#mysql> use mysql; use mysql的意思是切换到mysql这个库,这个库是所有的用户表和权限相关的表都在这个库里面,我们进入到这个库才能修改这个库里面的表。
#mysql> update user set password=password('123') where user='root' and host='localhost'; 其中password=password('123') 前面的password是变量,后面的password是mysql提供的给密码加密用的,我们最好不要明文的存密码,对吧,其中user是一个表,存着所有的mysql用户的信息。
方法1: 用SET PASSWORD命令
# 首先登录MySQL,使用mysql自带的那个客户端连接上mysql。
# 格式:mysql> set password for 用户名@localhost = password('新密码');
# 例子:mysql> set password for root@localhost = password('123');
方法2:用mysqladmin (因为我们将bin已经添加到环境变量了,这个mysqladmin也在bin目录下,所以可以直接使用这个mysqladmin功能,使用它来修改密码,不需要进入mysql里面去修改,不安全)
#关于mysqladmin的介绍:是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库、修改用户密码等等的功能,虽然mysqladmin的很多功能通过使用MySQL自带的mysql客户端可以搞定,但是有时候使用mysqladmin操作会比较简单。
# 格式:mysqladmin -u用户名 -p旧密码 password 新密码
# 例子:mysqladmin -uroot -p123456 password 123
方法3:用UPDATE直接编辑那个自动的mysql库中的user表
#首先登录MySQL,连接上mysql服务端。
#mysql> use mysql; use mysql的意思是切换到mysql这个库,这个库是所有的用户表和权限相关的表都在这个库里面,我们进入到这个库才能修改这个库里面的表。
#mysql> update user set password=password('123') where user='root' and host='localhost'; 其中password=password('123') 前面的password是变量,后面的password是mysql提供的给密码加密用的,我们最好不要明文的存密码,对吧,其中user是一个表,存着所有的mysql用户的信息。
2.4其它注意点
1.注意还有一个问题,看下图:当你写sql语句的时候,可能会出现下面这种情况,由于少写了一个引号,导致怎么也结束不了
1.注意还有一个问题,看下图:当你写sql语句的时候,可能会出现下面这种情况,由于少写了一个引号,导致怎么也结束不了
3.数据库的优势
#1.程序稳定性 :这样任意一台服务所在的机器崩溃了都不会影响数据和另外的服务。
#2.数据一致性 :所有的数据都存储在一起,所有的程序操作的数据都是统一的,就不会出现数据不一致的现象
#3.并发 :数据库可以良好的支持并发,所有的程序操作数据库都是通过网络,而数据库本身支持并发的网络操作,不需要我们自己写socket
#4.效率 :使用数据库对数据进行增删改查的效率要高出我们自己处理文件很多
#1.程序稳定性 :这样任意一台服务所在的机器崩溃了都不会影响数据和另外的服务。
#2.数据一致性 :所有的数据都存储在一起,所有的程序操作的数据都是统一的,就不会出现数据不一致的现象
#3.并发 :数据库可以良好的支持并发,所有的程序操作数据库都是通过网络,而数据库本身支持并发的网络操作,不需要我们自己写socket
#4.效率 :使用数据库对数据进行增删改查的效率要高出我们自己处理文件很多
4.mysql的基本操作命令
4.1操作文件夹/库(增删改查)
1.查看数据库
#show databases;
2.查看其中的一个库
#show create database db1;
3.创建数据库
#create database db1;
4.创建数据库并指定编码
#create database db1 charset utf8;
5.使用数据库
#use db1;
6.修改数据库
#alter database db1 charset utf8;
7.删除数据库
#drop database db1;
8.查看当前所在的库
#select database();
1.查看数据库
#show databases;
2.查看其中的一个库
#show create database db1;
3.创建数据库
#create database db1;
4.创建数据库并指定编码
#create database db1 charset utf8;
5.使用数据库
#use db1;
6.修改数据库
#alter database db1 charset utf8;
7.删除数据库
#drop database db1;
8.查看当前所在的库
#select database();
4.2操作文件/表(增删改查)
1.创建表(字段名不能相同)
#create table stu(id int,name char(16));
注:char(16)5.6版本以前是字节,5.6版本以后是字符
2.查看当下库的所有表
#show tables;
3.查看刚刚创建的那一张表
#show create table stu;
4.查看一张表的基本信息
#desc stu;
5.修改表的数据类型
#alter table class modify class_name char(16);
6.修改表的字段名和数据类型
#alter table class change class_name name char(18);
7.删除表
#drop table class;
1.创建表(字段名不能相同)
#create table stu(id int,name char(16));
注:char(16)5.6版本以前是字节,5.6版本以后是字符
2.查看当下库的所有表
#show tables;
3.查看刚刚创建的那一张表
#show create table stu;
4.查看一张表的基本信息
#desc stu;
5.修改表的数据类型
#alter table class modify class_name char(16);
6.修改表的字段名和数据类型
#alter table class change class_name name char(18);
7.删除表
#drop table class;
4.3操作文件中的内容/记录(增删改查)
1.新增一条记录
#insert into stu values(1,'大狗'),(2,'二狗');
#insert into stu(id,name) values(1,'大狗'),(2,'二狗');
2.查记录
#select 字段名 from stu;(查询表中某个字段的记录)
#select * from stu;
3.条件查询
#select * from stu where id = 1;
4.修改记录
#update stu set name = 'alisa' where id = 3;
5.删除记录
#delete from stu where name='二狗';
#delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
#truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
6.将一个表的内容查出来放到另一个表中
#insert into class2 select * from class;
7.查当前的时间
#select now();
8.删除不存在的记录不会报错
1.新增一条记录
#insert into stu values(1,'大狗'),(2,'二狗');
#insert into stu(id,name) values(1,'大狗'),(2,'二狗');
2.查记录
#select 字段名 from stu;(查询表中某个字段的记录)
#select * from stu;
3.条件查询
#select * from stu where id = 1;
4.修改记录
#update stu set name = 'alisa' where id = 3;
5.删除记录
#delete from stu where name='二狗';
#delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
#truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
6.将一个表的内容查出来放到另一个表中
#insert into class2 select * from class;
7.查当前的时间
#select now();
8.删除不存在的记录不会报错
4.4 查看字符集编码的指令
show variables like "%char%";
不乱码的思想:系统的编码、客户端、服务端、库、表、列,这几项的编码都要统一才不会出现乱码的情况。
show variables like "%char%";
不乱码的思想:系统的编码、客户端、服务端、库、表、列,这几项的编码都要统一才不会出现乱码的情况。
4.5MySQL客户端连接服务端时的完整指令
mysql -h 127.0.0.1 -p 3306 -u root -p
mysql -h 127.0.0.1 -p 3306 -u root -p
5.储存引擎
#MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。
#mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
查看当前的默认存储引擎:
#mysql> show variables like "default_storage_engine";
查询当前数据库支持的存储引擎
#mysql> show engines;
指定存储引擎建表:
1.在建表时指定
#mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;
2.也可以使用alter table语句,修改一个已经存在的表的存储引擎。
#mysql> alter table ai engine = innodb;
在配置文件中指定
#my.ini文件
[mysqld]
default-storage-engine=INNODB
InnoDB
#MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
InnoDB适用场景
#用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
#1.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息
#2.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;
MyISAM
#MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。
MyISAM适用场景
#如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
#1.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
#2.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
#3.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
Memory
#在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失
Memory适用场景
#将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
BLACKHOLE
#黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。blackhole引擎的原因是它不占硬盘空 间,作为一个中转,只负责记日志、传日志。创建的时候只有.frm表结构文件。
CSV
#它的表真的是以逗号分隔的文本文件。CSV 表允许你以 CSV 格式导入导出数据,以相同的读和写的格式和脚本和应用交互数据。由于 CSV 表没有索引,你最好是在普通操作中将数据放在 InnoDB 表里,只有在导入或导出阶段使用一下 CSV 表。
NDB
#(又名 NDBCLUSTER)——这种集群数据引擎尤其适合于需要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前能够支持
#MySql 集群的版本有:基于 MySql 5.1 的 MySQL Cluster NDB 7.1;基于 MySql 5.5 的 MySQL Cluster NDB 7.2;基于 MySql 5.6 的 MySQL Cluster NDB 7.3。同样基于 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正处于研发阶段。
Merge
#允许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们作为一个对象进行引用。适用于超大规模数据场景,如数据仓库。
Federated
#提供了从多个物理机上联接不同的 MySql 服务器来创建一个逻辑数据库的能力。适用于分布式或者数据市场的场景。
Example
#这种存储引擎用以保存阐明如何开始写新的存储引擎的 MySql 源码的例子。它主要针对于有兴趣的开发人员。这种存储引擎就是一个啥事也不做的 "存根"。你可以使用这种引擎创建表,但是你无法向其保存任何数据,也无法从它们检索任何索引。
#MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。
#mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
查看当前的默认存储引擎:
#mysql> show variables like "default_storage_engine";
查询当前数据库支持的存储引擎
#mysql> show engines;
指定存储引擎建表:
1.在建表时指定
#mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;
2.也可以使用alter table语句,修改一个已经存在的表的存储引擎。
#mysql> alter table ai engine = innodb;
在配置文件中指定
#my.ini文件
[mysqld]
default-storage-engine=INNODB
InnoDB
#MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。
InnoDB适用场景
#用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
#1.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息
#2.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;
MyISAM
#MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。
MyISAM适用场景
#如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
#1.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
#2.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
#3.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
Memory
#在内存中存储所有数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据非常快,因为它的数据是存放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失
Memory适用场景
#将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
BLACKHOLE
#黑洞存储引擎,类似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询常常返回一个空集。这种表可以应用于 DML 语句需要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。blackhole引擎的原因是它不占硬盘空 间,作为一个中转,只负责记日志、传日志。创建的时候只有.frm表结构文件。
CSV
#它的表真的是以逗号分隔的文本文件。CSV 表允许你以 CSV 格式导入导出数据,以相同的读和写的格式和脚本和应用交互数据。由于 CSV 表没有索引,你最好是在普通操作中将数据放在 InnoDB 表里,只有在导入或导出阶段使用一下 CSV 表。
NDB
#(又名 NDBCLUSTER)——这种集群数据引擎尤其适合于需要最高程度的正常运行时间和可用性的应用。注意:NDB 存储引擎在标准 MySql 5.6 版本里并不被支持。目前能够支持
#MySql 集群的版本有:基于 MySql 5.1 的 MySQL Cluster NDB 7.1;基于 MySql 5.5 的 MySQL Cluster NDB 7.2;基于 MySql 5.6 的 MySQL Cluster NDB 7.3。同样基于 MySql 5.6 的 MySQL Cluster NDB 7.4 目前正处于研发阶段。
Merge
#允许 MySql DBA 或开发者将一系列相同的 MyISAM 表进行分组,并把它们作为一个对象进行引用。适用于超大规模数据场景,如数据仓库。
Federated
#提供了从多个物理机上联接不同的 MySql 服务器来创建一个逻辑数据库的能力。适用于分布式或者数据市场的场景。
Example
#这种存储引擎用以保存阐明如何开始写新的存储引擎的 MySql 源码的例子。它主要针对于有兴趣的开发人员。这种存储引擎就是一个啥事也不做的 "存根"。你可以使用这种引擎创建表,但是你无法向其保存任何数据,也无法从它们检索任何索引。
MySQL架构总共四层,在上图中以虚线作为划分。
# 首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。
# 第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
# 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。
# 第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。
MySQL架构总共四层,在上图中以虚线作为划分。
# 首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。
# 第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
# 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。
# 第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。
6.事务
1.简单地说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败。
# 例如:你给我转账5块钱,流程如下
# a.从你银行卡取出5块钱,剩余计算money-5
# b.把上面5块钱打入我的账户上,我收到5块,剩余计算money+5.
# 上述转账的过程,对应的sql语句为:
# update 你_account set money=money-5 where name='你';
# update 我_account set money=money+5 where name='我';
# 上述的两条SQL操作,在事务中的操作就是要么都执行,要么都不执行,不然钱就对不上了。
# 这就是事务的原子性(Atomicity)。
2.事务的四大特性
#1.原子性(Atomicity)
# 事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
#2.一致性(Consistency)
# 事务发生前和发生后,数据的完整性必须保持一致。
#3.隔离性(Isolation)
# 当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。
#4.持久性(Durability)
# 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过'补偿性事务'。
3.事务的开启:
# 数据库默认事务是自动提交的,也就是发一条sql他就执行一条。如果想多条sql放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql会自动回滚事务。或者我们使用rollback命令手动回滚事务。
1.简单地说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败。
# 例如:你给我转账5块钱,流程如下
# a.从你银行卡取出5块钱,剩余计算money-5
# b.把上面5块钱打入我的账户上,我收到5块,剩余计算money+5.
# 上述转账的过程,对应的sql语句为:
# update 你_account set money=money-5 where name='你';
# update 我_account set money=money+5 where name='我';
# 上述的两条SQL操作,在事务中的操作就是要么都执行,要么都不执行,不然钱就对不上了。
# 这就是事务的原子性(Atomicity)。
2.事务的四大特性
#1.原子性(Atomicity)
# 事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。
#2.一致性(Consistency)
# 事务发生前和发生后,数据的完整性必须保持一致。
#3.隔离性(Isolation)
# 当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其他人的操作在这个事务的执行过程中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行之前的内容,等这个事务执行完才能拿到新的数据。
#4.持久性(Durability)
# 一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允撤销,只能通过'补偿性事务'。
3.事务的开启:
# 数据库默认事务是自动提交的,也就是发一条sql他就执行一条。如果想多条sql放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql会自动回滚事务。或者我们使用rollback命令手动回滚事务。