一.MySQL介绍
1.mysql版本
双授权版本:社区版(完全免费,功能也够nb了)和商业版(更好,功能更多更强大一些,但是收费,VIP,有售后服务,也会参考和吸收社区版的一些nb的功能,安全性和稳定性都是最好的,大几十万),一般NB的开源软件都是双授权的
每个版本又分四个版本依次进行发布:
Alpha版:一般只在开发公司内部使用,不对外公开,测试、自我检查的版本
Beta版:一般是开发完也测试完的版本,一般不会出现比较大的性能bug(一般我们不用,阿里、去哪儿会使用这个版本,有些新功能,内部有高手能调,也能评估新功能)
RC版:根据Beta版测试之后收集到一些bug等在进行完善的一个版本
GA版:软件正式发布的版本,没有特别的需求一定要使用GA版,有些公司追求新功能会使用Beta版,这是个例。
2.MySQL的产品线:(mysql是C++写的,oracle 9i版本之前是C语言写的,之后主要是java)
最早期,mysql是按照3.x--4.x--5.x等来开发的,但是为了提高MySQL的竞争优势,以及提高性能、降低开发维护成本等原因,同时,更方便企业用户更精准的选择合适的版本产品用于自己的企业生产环境中,MySQL在发展到5.1系列版本之后,重新规划为三条产品线。
第一条:5.0.xx 到 5.1.xx产品线系列介绍
第二条:5.4.xx 到 5.7.xx产品线系列介绍(主流:5.5和5.6)
第三条:6.0.xx 到 7.1.xx产品线系列介绍
3. MySQL数据库软件命名介绍
以mysql-5.6.42.tar.gz的版本号来解释:
1.第一个数字5是主版本号,描述了文件格式。所有版本5发行都有相同的文件格式。
2.第二个数字6是发行级别。主版本号和发行级别组合到一起便构成了发行序列号。
3.第三个数据42是在此发行系列的版本号,随每个新发布版递增。通常你需要已经选择发行的最新版本,每次更新后,版本字符串的最后一个数字会递增。如果增加了一些新功能或者微小的不兼容性,版本字符串的第二个数字会递增。如果文件格式改变,第一个数字会递增。
一般有的版本也会加上上面我们说的4个版本的后缀,beta、alpha、rc版、ga版等等,我们举得这个例子是不带后缀的,就相当于GA版
MySQL版本选择建议
1.稳定版:选择开源的社区版的稳定版GA版本
2.产品线:可以选择5.1、5.5、5.6,互联网公司主流5.5和5.6,其次是5.1.
3.选择MySQL数据库GA版发布后6个月以上的GA版本。
4.要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本
5.最好向后较长时间没有更新发布的版本。
6.开发、测试、运维、DBA进行自己本地测试的时候,最好要和线上的版本一致,最差也要兼容,所以作为开发,你要清楚公司用的哪个版本的数据库
7.作为内部开发测试数据库环境,跑大概3-6个月的时间。
8.优先企业非核心业务采用新版本的数据库GA版本的软件。
10.想DBA高手请教,或者在技术分为好的群里和大家一起交流,使用真正高手用过的好用的GA版本产品
经过上述工序后,若没有重要的功能BUG或者性能瓶颈,则可以开始考虑作为任何业务数据服务的后端数据库软件。
二.安装命令
#1、下载:MySQL Community Server 5.7.16
http://dev.mysql.com/downloads/mysql/
#2、解压
如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:mysql-5.7.16-winx64
#3、添加环境变量
【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】
#4、初始化
mysqld --initialize-insecure
#5、启动MySQL服务
mysqld # 启动MySQL服务
#6、启动MySQL客户端并连接MySQL服务
mysql -u root -p # 连接MySQL服务器
#7、将mysql添加系统服务
注意:--install前,必须用mysql启动命令的绝对路径
# 制作MySQL的Windows服务,在终端执行此命令:
"c:mysql-5.7.16-winx64inmysqld" --install
# 移除MySQL的Windows服务,在终端执行此命令:
"c:mysql-5.7.16-winx64inmysqld" --remove
注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
# 启动MySQL服务
net start mysql
# 关闭MySQL服务
net stop mysql
1. 配置环境变量
打开mysql目录中的bin文件夹 将路径加入系统变量path中:
2.打开cmd命令窗口
mysqld --install # 安装
2.启动服务
net start mysql # 启动服务
3.关闭服务
net stop mysql # 关闭服务
4.卸载mysql
mysqld romove # 卸载mysql
5. 连接命令
mysql -u -root -p #使用mysql自带的客户端进行连接,回车后输入密码,如果没有密码直接回车即可连接
三.root用户名密码设置及忘记密码的解决办法
1.设置密码的三种方法
1.cmd 用mysql命令登陆
set password for 用户名@localhost = password('新密码');
例:
set password for root@localhost = password('123')
2.用mysqladmin (因为我们将bin已经添加到环境变量了,这个mysqladmin也在bin目录下,所以可以直接使用这个mysqladmin功能,使用它来修改密码)
mysqladmin是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库、修改用户密码等等的功能,虽然mysqladmin的很多功能通过使用MySQL自带的mysql客户端可以搞定,但是有时候使用mysqladmin操作会比较简单。
mysqladmin -u 用户名 -p 旧密码 password 新密码
例:
mysqladmin -uroot -p123456 password 123
只用mysqladmin的时候,会出现一个warning警告信息:Warning: Using a password on the command line interface can be insecure.,这个没关系,是提示你,你直接在cmd下使用明文设置密码的时候,是不安全的,因为别人可以通过翻看你输入指令的历史记录来查看到你设置的密码,所以提示你一下,不信你按上下键,可以看到自己之前输入的命令,或者输入下面这个指令也可以看到:
doskey/histroy # 查看之前输入的命令 按方向键的上下也可以
3.用update直接编辑mysql库中的user表,首先cmd输入mysql连接mysql服务端
use mysql; # 1 进入mysql库 update user set password = password('123') where user='root' and host = 'localhost'; #2 修改信息 flush privileges; # 3 刷新权限,让其生效,否则不生效,修改不成功
2.忘记root密码时,(root密码最好不要忘记,工作中千万要记录下来,数据库不会轻易让你重启,而且不会给你root权限)
以windows为例
1. 关闭正在运行的MySQL服务,net stop mysql(这个mysql是你添加的mysqld到系统服务时的服务名)。
2. 打开DOS窗口,转到mysqlin目录。
3. 输入mysqld --skip-grant-tables 回车。
注意一个问题,如果我们直接使用的上面这个指令,也即是mysqld --skip-grant-tables,也就是直接通过mysqld启动的mysql服务的话,我们就不能通过net stop mysql的方式来关闭mysql服务了。但是可以通过别的方式来关闭,我在安装mysql的那篇博客里面写到了,杀进程的方式,知道你肯定忘记了,再给你写一下(win10):tasklist |findstr mysqld找到这个mysqld服务的端口号,然后taskkill /F /PID 端口号来杀死这个mysql服务的进行,以后就可以使用net start/stop mysql的方式来启动和关闭了。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysqlin目录。
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
6. 连接权限数据库: use mysql; 。
7. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
8. 刷新权限(必须步骤):flush privileges; 。凡是涉及到密码修改或者后面我们会学到的权限修改,修改完之后全部要再执行一下这一句。
9. 退出 quit。
10. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
四.修改字符集编码
一、MySQL字符集编码简单介绍 在使用MySQL时要注意6个需要编码的地方:系统的编码、客户端、服务端、库、表、列。字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在mysql中输入命令show session variables like '%char%'能够看到例如以下一些字符集(下面是以win10为例,生产中多数时linux,在linux里面除了latin1之外都是utf8的字符集): mysql> show variables like "%char%"; +--------------------------+-------------------------------------------+ | Variable_name | Value | +--------------------------+-------------------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | F:jjmysql-5.6.42-winx64sharecharsets | +--------------------------+-------------------------------------------+ 8 rows in set (0.00 sec) mysql中的字符集都相应着一个默认的校对规则(COLLATION),当然一个字符集也可能相应多个校对规则,可是两个不同的字符集不能相应同一个规则。使用默认的就可以了 以下来看看上面命令列出的字符集相关变量的含义: character_set_client:server解析客户端sql语句的字符集.(The character set for statements that arrive from the client. The session value of this variable is set using the character set requested by the client when the client connects to the server). character_set_connection:字符串字面值(literal strings)的字符集. character_set_results:server返回给客户端的查询结果或者错误提示的字符集编码.(The character set used for returning query results such as result sets or error messages to the client) character_set_system:这是mysqlserver用来存储元数据的编码,通常就是utf8,不要去改动它. character_sets_dir:这是mysql字符集编码存储文件夹. character_set_filesystem:这是文件系统字符集编码,主要用于解析用于文件名称的字符串字面值,如LOAD DATA INFILE和SELECT ...INTO OUTFILE等语句以及LOAD_FILE()函数.在打开文件之前,文件名称会从character_set_client转换为character_set_filesystem指定的编码.默认值为binary,也就是说不会进行转换.比如我们设置的character_set_client=GBK,而character_set_filesystem为默认值的话,则采用SELECT...INTO OUTFILE "文件名称",文件名称为GBK编码.反之,假设我们设置了character_set_filesystem=UTF8,则导出的文件名称为UTF8编码. 比如:linux系统的终端编码是UTF8,系统默认语言和编码为zh_CN.UTF8.我们有一个数据库名为test,test中有个表名为t1,编码为latin1,另外,我们在mysqlclient运行了SET NAMES GBK,假设我们不改动character_set_filesystem的值,运行SELECT * FROM t1 INTO OUTFILE '文件1', 能够发现相应的文件夹以下生成了一个名为"文件1"的文件,那文件名称编码是什么呢?事实上这里有几个地方须要注意,首先,我们的sql语句里面的"文件1"原生编码就是终端编码UTF8,也就是'xe6x96x87xe4xbbxb61',而导出数据的语句SELECT * FROM t1 INTO OUTFILE '文件1',依照前面的说法,由于character_set_filesystem为binary,因此'xe6x96x87xe4xbbxb61'不会转换,这样终于还是'xe6x96x87xe4xbbxb61',这样在zh_CN.UTF8的系统中文件名称不会乱码.而假设我们设置了character_set_filesystem=UTF8,则原生的'xe6x96x87xe4xbbxb61'会先依照GBK解码,然后用UTF8编码,最后的结果是"xe9x8fx82xe5x9bxa6xe6xacxa21",这样文件名称就会乱码了.所以这个变量也最好不要改动,用默认值就OK. character_set_server:服务器默认字符集编码,假设创建数据库的时候没有指定编码,则采用character_set_server指定编码. character_set_database:默认数据库的字符集编码.假设没有默认数据库,则该变量值与character_set_server同样.事实上这个值代表的就是你当前数据库的编码而已,比方使用"use test",而test数据库的编码为latin1的话,这个值就是latin1.而你切换的时候"use test2",则character_set_database的值就是数据库test2的编码. 二、MySQL字符集编码层次 第一部分主要是归纳了MySQL文档中关于字符集编码的说明。这部分主要说明下MySQL中字符集编码层次:服务端-->数据库-->表-->字段。 关于系统的编码主要针对的是我们将来在存储文件的时候,有可能会将文件直接存贮在mysql的服务器上,那么,我们在数据库里面存的就是这些文件的路径,实际文件是存在系统里面的,那么文件名称就会受到你系统编码的影响,比如我们mysql设置的utf8编码的格式存储的文件路径,但是系统默认是gbk编码的,那么文件在保存到系统里的时候,文件的名称和你存在mysql里面的文件名称就对应不上了,出现乱码显示的问题,所以也要注意系统的编码。客户端的编码问题,我们在第一节的时候说了一下,大家应该比较了解啦。所以我们下面之说mysql内部设置的这些编码问题。 简单来说,服务器编码就是character_set_server来指定的.当我们创建数据库的时候能够指定编码,假设没有指定,采用的就是character_set_server指定的编码.比如:我们使用"create database t1 character set gbk",这里我们指定了数据库t1的编码为gbk,所以不会采用character_set_server指定的编码.而假设我们使用"create database t2",则通过"show create database t2"能够看到t2的编码为character_set_server定的编码. 同理,mysql表也能够有自己独立的编码,在创建表的时候能够指定,假设没有指定,则默认采用数据库的编码.比方我们再之前的数据库t1创建表t11,"create table t11(i int) character set utf8",则表t11的编码为utf8,假设不指定编码则编码为数据库t1的编码gbk. 此外,mysql表中的字段也能够有自己的编码,假设不指定字段编码,则字段编码与表的编码一致. 三、MySQL连接字符集 前面谈到的编码内容基本都不会产生乱码问题,mysql中容易产生乱码的地方在character_set_client, character_set_connection, character_set_results这三个变量的设定.能够简单的通过set names utf8或者charset utf8命令来一次设置这三个參数. 从文档中的解释来看,mysql连接字符集转换主要包含以下三个步骤: 1.character_set_client是client发送过来的sql语句的编码,由于服务端本身并不知道client的sql语句的编码是什么,所以是以这个变量作为clientsql语句的初始编码.而服务端接收到sql语句后,则会将sql语句转换为character_set_connection指定的编码(注意,对于字面值字符串,假设前面有introducer标记如latin1或utf8,则不会进行这一步转换).转换完毕,才会真正运行sql语句. 2.进行内部操作前将sql语句中的数据从character_set_connection转换为数据表中对应字段的编码. 3.将操作结果从内部字符集编码转换为character_set_results编码.
1.查看数据库编码
show create database 数据库名G;
2.查看各个位置(客户端,服务端,数据库)的编码
show variables like '%char%';
character_set_client
character_set_connection
character_set_results
这三项和服务端字符集不一样导致乱码
3. 临时修改字符集编码
set names 编码; # 例: set names latin1;
4.配置文件
配置文件修改客户端和服务端参数,可以实现设置字符的效果,并且可以永久生效,还可以设置模式 和用户名密码缺省值,这样在cmd中输入mysql就不用输入用户名
和密码直接登陆了.
在这里建一个my.ini文件, 注意文件后缀.
注意系统是否隐藏了文件后缀,不要建成my.ini.ini 我曾经这样整了一下午才发现,难受.
内容如下:
mysqld是mysql的服务端