MySQL数据库html
本节目录java
1. 数据库???
什么是数据库呢?python
先来看看百度怎么说的mysql
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户能够对文件中的数据运行新增、截取、更新、删除等操做。
所谓“数据库”系以必定方式储存在一块儿、能予多个用户共享、具备尽量小的冗余度、与应用程序彼此独立的数据集合。
百度的貌似很差理解啊,让我说啊,数据库是存储数据的地方,超哥,你这不是废话么?这位同窗,你你你你你说的对,哈哈,存数据的地方是存在哪里呢,存在硬盘上,为何不是存在内存里面,由于内存没法永久保存。以前咱们存数据都是使用的文件,在一个word文档里面写一些羞羞的网址,而后保存,就存储到硬盘上了。有同窗就会说了,超哥,我这经过文件不是也将数据保存上了吗?是的,没毛病,可是你想,经过文件来操做数据,效率是否是很低,首先打开关闭就比较慢,其次是咱们操做起来也比较麻烦,对不对,若是我想记录一条关于我我的信息的数据,我使用文档来存,是否是很不友好,而且咱们要查数据的时候,看图1:图1是一个word里面记录的信息,若是我想查询出全部人的名字,这个操做是否是就很难搞定了,来来来,配合起来~~,你应该说是的,那我就接着说,有同窗可能就会说了,老师我用excel啊,看图2,一列就搞定了,没毛病,可是你想打开操做excel效率低不低。而且经过你本身写的程序来操做这些文件是否是很麻烦,就大家学的open函数。其实效率低的缘由是由于咱们知道文件都是保存在硬盘上的,硬盘的效率自己就低,因此没办法。linux
因此,为了方便的管理这些数据,又能提升对数据的管理效率,各个公司就开始想办法了,喊出了口号:咱们要写一套软件,专门管理数据!!,让应用程序或者说项目程序不直接和硬盘打交道了,让咱们本身写的管理数据的软件来操做数据,而且咱们写的软件要解决下面几个问题:1.直接操做硬盘上的文件效率低 。 2. 经过操做文件来读写数据很麻烦。 3. 咱们本身的电脑上写的程序和咱们本身电脑上存储的数据都在这一台电脑上了,想和别人共享一个数据或者一个文档也是比较麻烦的,而且若是和别人共享,那么可能形成本身电脑的安全性变低了,可是公司内部的项目可能就会使用一些共同的数据啊,这样共享起来就很麻烦。 4. 项目和数据若是都在一个电脑上,例如京东,若是有一天,京东的项目出问题了,或者部署这个项目的电脑(服务器)崩了,你的数据是否是就麻烦了,嗯,稳定性和安全性都不够,咱们要把数据和项目分开管理,通常公司都会这么作,看下图:程序员
经过上面这个图里面的思想,貌似解决了共享数据和数据稳定性的问题,可是专门管理数据的机器里面仍是将数据存到硬盘上啊,若是项目直接和硬盘打交道,效率仍是差啊,而且虽然数据共享起来了,咱们经过前面的学习知道,数据共享起来就会出现数据不安全的问题和数据混乱的问题啊,怎么办,加锁!并且不少项目或者人均可能过来链接中间这个存放数据的机器啊,咱们不能让全部人都能链接这个机器啊,怎么办,加链接验证!而且要作好备份,由于如今数据多重要啊,因此还要支持作数据备份的工做!多我的链接使用这个机器中的数据的时候,还要支持并发啊,每一个人的感受都是本身单独的在操做这个机器啊,怎么办,支持并发!web
哎,想要好好的玩数据,还真是tm的麻烦,不过各个公司都不怕艰难,都在努力的搞事情,搞一套能够高效管理数据的工具,称之为数据库管理软件/系统(应用软件)redis
又出来一个新词啊,数据库管理系统,来,先看看百度怎么解释的sql
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,通常具备存储、截取、安全保障、备份等基础功能。数据库管理系统能够依据它所支持的数据库模型来做分类,例如关系式、XML;或依据所支持的计算机类型来做分类,例如服务器群集、移动电话;或依据所用查询语言来做分类,例如SQL、XQuery;或依据性能冲量重点来做分类,例如最大规模、最高运行速度;亦或其余的分类方式。不论使用哪一种分类方式,一些DBMS可以跨类别,例如,同时支持多种查询语言。
貌似又是很差理解,来吧,通俗解释--> 这个工具负责来和硬盘打交道(固然中间还隔着操做系统),高效的管理数据,而且还支持对外通讯,网络通讯都是基于的socket,也就是说它还至关于一个socket服务端,那么想来到这个存数据的机器上来操做数据的人或者项目均可以链接到这个工具,并经过这个工具来管理数据,那么咱们就能够经过下面这个图来看看这工具的工做方式:mongodb
上面这个图是否是就一目了然了,这个数据管理系统咱们称之为DBMS,DB(database)就是数据库的意义,M(manage)就是管理的意思,S(system)就是系统的意思,其实就是英文名的首字符缩写。市场上冒出了不少优秀的数据库管理系统,例如:mysql、oracle、db2等等,人家开发好了,你使用就好了,既然是使用别人写好的数据库管理系统,那么咱们在操做的时候,就要按照人家的规范来操做,这个规范叫作sql,咱们经过这个系统来操做数据的语句叫作sql语句。那么过程就是这个样子的:首先下载安装人家的数据管理系统,而后启动系统,咱们的项目若是想经过这个系统来操做数据,那么就须要你的项目中字节写一个socket客户端,要知足人家这个系统的服务端的消息格式要求,而后就按照人家规定好的sql语句写好操做数据的命令,使用你的写好的客户端经过网络发送给这个存放数据的机器上的数据管理系统的服务端,服务端街道这个命令以后,解析,而后产生对应的数据操做,你要是查询数据,就将查询数来的数据原路返回给你,若是你要是修改数据,那么我服务端就在系统上修改对应的数据。这就是整个操做流程了,其实这个系统就是一个基于socket编写的C/S架构的软件。
有人称这个数据管理系统为数据库,有人称这个存放数据的机器叫作数据库,有人称里面的一个存放数据的库叫作数据库,(存放数据的库,其实就是将数据分开管理,例如:你有两个项目来使用这个数据管理系统,那么咱们两个项目的数据确定是不能掺和在一块的对不对,那么就须要分开管理,分开管理的是能够给每一个项目单首创建一个库,每一个库存放本身项目对应的数据,有人称这个库为数据库),可是无论怎么称呼,你结合他当时说话的场景,就可以理解他指的是什么了,反正大意也都差很少,这个知道就行了。那么咱们来看看有哪些NB的数据库管理系统啊,看下节的分类(仍是先安装一下mysql搞一下看看在看分类吧!直接看第三大节)。
2. 数据库分类
目前的数据库能够分为两个大类:关系型数据库和非关系型数据库
2.1 关系型数据库(RDBMS)
解释:关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式,不是excel,可是和excel的形式很像),结合下图来看一下,
这个表看着好乱啊,可是你细看一下,这几个表之间创建了某种关系,共享着双方的数据。这就是关系。关系型数据库里面存数据的时候就相似这个样子的。有个大概了解了吗~~~
操做关系型数据库的命令,咱们称之为SQL,看解释

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。 结构化查询语言是高级的非过程化编程语言,容许用户在高层数据结构上工做。它不要求用户指定对数据的存放方法,也不须要用户了解具体的数据存放方式,因此具备彻底不一样底层结构的不一样数据库系统, 能够使用相同的结构化查询语言做为数据输入与管理的接口。结构化查询语言语句能够嵌套,这使它具备极大的灵活性和强大的功能。 1986年10月,美国国家标准协会对SQL进行规范后,以此做为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年获得国际标准组织的支持下成为国际标准。不过各类通行的数据库系统在其实践过程当中都对SQL规范做了某些编改和扩充。因此,实际上不一样数据库系统之间的SQL不能彻底相互通用
其中最后一句挺重要的:不一样数据库系统之间的SQL不能彻底相互通用
经常使用的关系型数据库:

2.1.1 oracle数据库 Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。Oracle公司是最先开发关系型数据库的厂商之一,其产品支持最普遍的操做系统平台。目前Oracle关系数据库产品的市场占有率首屈一指 。 Oracle公司是目前全球最大的数据库软件公司,也是近年业务增加极为迅速的软件提供与服务商 主要应用范围:传统大企业、大公司、政府、金融、证券等。 版本升级:oracle8i,oracle9i,oracle10g,oracle11g,oracle12c 2.1.2 MySQL MySQL被普遍的应用在Internet上的大中小型网站中。因为体积小、速度快、整体拥有成本低,开放源代码 2.1.3 MariaDB数据库 MAriaDB数据库管理系统是MySQL数据库的一个分支,主要由开元社区维护,采用GPL受权许可。开发这个MariaDB的缘由之一是:甲骨文公司收购了MySQL后,有MySQL闭源的潜在风险,所以MySQL开元社区采用分支的方式来避开这个风险。 MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM的存储引擎,它使用了Percona的XtraDB(InnoDB的变体)这个版本还包括了PrimeBase XT (PBXT)和Federated X存储引擎。 2.1.4 SQL Server数据库 Microsoft SQL Server是微软公司开发的大型关系数据库系统。SQL Server的功能比较全面,效率高,能够做为中型企业或单位的数据库平台。SQL Server能够与Winodws操做系统紧密集成,不管是应用程序开发速度仍是系统事务处理运行速度,都获得较大的提高,对于在Windows平台上开发的各类企业级信息管理系统来讲,不管是C/S(客户机/服务器)架构仍是B/S(浏览器/服务器)架构。SQL Server都是一个很好的选择。SQL Server的缺点是只能在Windows系统下运行 2.1.5 Access数据库 Access是入门级小型桌面数据库,性能安全性都很通常,可供我的管理或小型企业只用 Access不是数据库语言,只是一个数据库程序,目前最新版本为Office 2007,其特色主要以下: (1)完善地管理各类数据库对象,具备强大的数据组织,用户管理、安全检查等功能 (2)强大的数据处理功能,在一个工做组级别的网络环境中,使用Access开发的多用户管理系统具备传统的XSASE(DBASE、FoxBASE的统称)数据库系统所没法实现的客户服务器(Ckient/Server)结构和响应的数据库安全机制,Access具有了许多先进的大型数据管理管理系统所具有的特征。 (3)能够方便地生成各类数据对象,利用存储的数据创建窗体和报表 (4)做为Office套件的一部分,能够与Office集成,实现无缝链接 (5)可以利用Web检索和发布数据,实现与Internet的链接,Access主要适用于中小企业应用系统,或做为客户机/服务器系统中的客户端数据库。 2.1.6 其余不经常使用关系型数据库 DB2,PostgreSQL,Informix,Sybase等。这些关系型数据库逐步的淡化了普通运维的实现,特别是互联网公司几乎见不到
2.2 非关系型数据库
非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Olnly SQL”
指的是非关系型数据库,而不是“No SQL”的意思,所以,NoSQL的产生并非要完全地否认关系型数据库,而是做为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下能够发挥出不可思议的高效率和高性能。
随着互联网Web2.0网站的星期,传统的关系型数据库在应付web2,0网站,特别是对于规模日益扩大的海量数据,超大规模和高并发的微博、微信、SNS类型的web2.0纯动态网站已经显得力不从心,暴露了不少难以克服的问题。
例如:传统的关系型数据库IO瓶颈、性能瓶颈都难以有效突破,因而出现了大批针对特定场景,以高性能和使用便利为目的功能特异化的数据库产品。NOSQL(非关系型)类的数据就是在这样的情景下诞生并获得了很是迅速的发展
高性能、高并发、对数据一致性要求不高
开源的NoSQL体系,如Facebook的Cassandra,Apache的HBase,也获得了普遍认同,Redis,mongb也逐渐愈来愈受到各种大中小型公司的欢迎和追捧
NOSQL非关系型数据库小结:
一、NOSQL不是否认关系数据库,而是做为关系数据库的一个重要补充
二、NOSQL为了高性能、高并发而生,忽略影响高性能,高并发的功能
三、NOSQL典型产品memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库)
非关系型数据库又分为如下4种:

(1)键值(Key-Value)存储数据库 键值数据库就相似传统语言中使用哈希表,能够经过key来添加、查询或删除数据,由于使用key主键访问,因此会得到很高的性能及扩展性 键值(Key-Value)数据库主要是使用一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来讲的优点在于简单、易部署、高并发 k1—>数据 k2—>数据 典型产品:Memcached、Redis、MemcacheDB、BerkeleyDB (2)列存储(Column-oriedted)数据库 ======>了解便可,通常公司用不到 这部分数据库一般用来分布式存储的海量数据,键仍然存在,可是他们的特色是指向了多个列。 典型产品:Cassandra,HBase (3)面向文档(Document-Oriented)数据库 面向文档数据库会将以文档的形式存储。每一个文档都是自包含的数据单元,是一系列数据项的集合。每一个数据项都有一个名称与对应的值,值既能够是简单的数据类型,如字符串、数字和日期等;也能够是复杂的类型,若有序列表和关系对象。数据存储的最小单位是文档,同一个表中存储的文档属性能够是不一样的,数据能够使用XML、JSON或者JSONB等多种形式存储 典型产品:MorgoDB、CouchDB (4)图形(Graph)数据库
常见的非关系型数据库

2.2.1 memcached(key-value) Memcaced是一个开源的、高性能的、具备分布式内存对象的缓存系统。经过它能够减轻数据库负载,加速动态的web应用,最第一版本由LiveJoumal 的Brad Fitzpatrick在2003年开发完成。目前全球有很是多的用户都在使用它来架构主机的大负载网站或提高主机的高访问网站的响应速度。注意:Memcache 是这个项目的名称,而Memcached是服务端的主程序文件名。 缓存通常用来保存一些进程被存取的对象或数据,经过缓存来存取对象或数据要比在磁盘上存取块不少,前者是内存,后者是磁盘、Memcached是一种纯内存缓存系统,把常常存取的对象或数据缓存在memcached的内存中,这些被缓存的数据被程序经过API的方式被读取,memcached里面的数据就像一张巨大的hash表,数据以key-value对的方式存在。Memcached经过缓存常常被存取的对象或数据,从而减轻频繁读取数据库的压力,提升网站的响应速度,构建出快速更快的可扩展的Web应用。 官网:http://memcached.org/ 因为memcached为纯内存缓存软件,一旦重启全部数据都会丢失,所以,新浪网基于Memcached开发了一个开源项目Memcachedb。经过为Memcached增长Berkeley DB的特久化存储机制和异步主复制机制,使Memcached具有了事务恢复能力、持久化数据能力和分布式复制能力,memcached很是适合须要超高性能读写速度、持久化保存的应用场景,可是最近几年逐渐被其余的持久化产品替代如Redis Memcached小结: 一、key-value行数据库 2、纯内存数据库 3、持久化memcachedb(sina) 2.2.2 Redis(key-value) 和Memcached相似,redis也是一个key-value型存储系统。但redis支持的存储value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)等。这些数据类型都支持push/pop、add/remove及取交集、并集和差集及更丰富的操做,并且这些操做都是原子性的。为了保证效率,redis的数据都是缓存在内存中。区别是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在基础上实现了master-slave(主从)同步。 redis是一个高性能的key-value数据库。redis的出现、很大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到很好的补充做用。它提供了Python、Ruby、Erlang、PHP客户端,使用方便。 官方:http://www.redis.io/documentation redis特色: 1)支持内存缓存,这个功能至关于memcached 2)支持持久化存储,这个功能至关于memcachedb,ttserver 3)数据库类型更丰富。比其余key-value库功能更强 4)支持主从集群、分布式 5)支持队列等特殊功能 应用:缓存从存取memcached更改存取redis 2.2.3 MongoDB(Document-oriented) MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。他支持的数据库结构很是松散,相似json的bjson格式,所以能够存储比较复杂的数据类型。Mongodb最大的特色是他支持的查询语言很是强大,其语法有点相似于面向对象的查询语言,几乎能够实现相似关系数据库单表查询的绝大部分功能,并且还支持对数据创建索引。 特色: 高性能、易部署、易使用、存储数据很是方便 主要功能特性: 1.面向集合存储,易存储对象类型的数据 2.“面向集合”(Collenction-Orented)意思是数据库被分组存储在数据集中,被称为一个集合(Collenction)每一个 集合在数据库中都有一个惟一的标识名,而且能够包含无限数目的文档,集合的概念相似关系型数据库(RDBMS)里的表(table)不一样的是它不须要定义任何模式(schema) 3.模式自由 模式自由(schema-free)意为着存储在mongodb数据库中的文件,咱们不须要知道它的任何结构定义。 4.支持动态查询 5.支持彻底索引,包含内部对象 6.支持查询 7.支持复制和故障恢复 8.使用高效的二进制数据存储,包括大型对象 9.自动处理碎片、以支持云计算层次的扩展性 2.2.4 Cassandra(Column-oriented) Apache Cassndra是一套开源分布式Key-Value存储系统。它最初由Facebook开发,用于存储特别大的数据。Facebook目前在使用此系统。 主要特色: 1.分布式 2.基于column的结构化 3.高伸展性 4.Cassandra的主要特色就是它不是一个数据库,而是由一堆数据库节点共同构成一个分布式网络服务,对Cassandra的一个写操做,会被复制到其余节点上去,对Cassandra的读操做。也会被路由到某个节点上面去读取。 Cassandir是一个混合型的非关系的数据库,相似于Google的BigTable。其主要功能比Dynomie(分布式的key-value存储系统)更丰富,Cassandra最初由Facebook开发,后转变成了开源项目。 2.2.5 其余不经常使用非关系型数据库 HBase、MemcacheDB、BerkeleyDB、Tokyo Cabinet\Tokyo Tyrant(ttserver) ttserver 持久化输出,缺点存储2千万条 性能降低(由日本人发明)
看了这么多的数据库,咱们主要讲的是MySQL,这个公司里面很是经常使用的又很是nb的关系型数据库,后面还会将一些非关系型数据库的使用,来吧,咱们好好认识一下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版
4.1 MySQL版本选择建议
1.稳定版:选择开源的社区版的稳定版GA版本
2.产品线:能够选择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.下载安装
这个下载安装内容我专门整理了一个博客,专门针对的windows10的:https://www.cnblogs.com/clschao/articles/9916971.html ,你们参考其中的第二种下载安装方法,咱们后面的学习就是根据第二种方法来的。
linux系统下MySQL数据库企业生产中经常使用的4中安装方法介绍(未来若是须要你一个开发人员来安装数据库或者本身想研究数据库的时候再自行去研究吧~~~这里就简单给你们提一下~~~)
1.yum/rpm方式安装MySQL
2.常规方式编译安装MySQL
3.采用cmake方式编译安装MySQL
4.采用二进制方式免编译安装MySQL
以上的安装方法均可以,性能上也不会有太多的差距,只是不一样层次的人的安装习惯不一样,了解一下就能够了,多数的运维人员习惯使用cmake编译方式安装,若是数据库服务器不少,并且对定制化有要求,能够选择经过源码定制rpm包,搭建yum参数的方式安装,可是须要你有必定的能力,还有好多专业的DBA选择二进制免编译安装的方式进行安装。
未来你们更多的是面对linux下的mysql安装和使用(没有包含上述的全部安装方法),我也给你们整理了一篇博客(centos7.1下安装mysql5.6):https://www.cnblogs.com/clschao/articles/6736840.html
若是我上面这篇博客安装的时候有问题,而且本身解决不了的话,删除你已经安装的mysql,而后看另一篇博客进行安装(centos7下安装mysql5.6),其实道理都差很少,个人那一篇详细一些,还有一些关于防火墙的设置,话很少说。这一篇博客也挺好的,转载过来给你们看看:https://blog.csdn.net/qq_17776287/article/details/53536761
若是大家公司用的是红帽或者是Ubuntu,能够自行百度教程来尝试安装,这里我就不给你们演示啦。
这位同窗,若是你mac本,我只能说超哥一直以来都很穷。。。没有一台本身的mac本,因此不是很熟悉,可是给你找了两篇博客,能够参考一下,我大体看了一下,过程是差很少的:
mac 安装mysql5.6 :https://blog.csdn.net/mike694439716/article/details/48218239?utm_source=blogxgwz0
mac 安装tar.gz版MySQL5.6:https://blog.csdn.net/zmx729618/article/details/72769840
若是Mac本安装完mysql以后,登录之后,无论运行什么指令,老是提示这个:mac mysql error You must reset your password using ALTER USER statement before executing this statement.
你须要作的就是修改密码就好了,默认安装完成以后,mysql应该是安装在了/usr/local/mysql这个目录下,里面的目录结构和windows的是同样的。
mysql安装的简单总结:

#一、下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ #二、解压 若是想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64 #三、添加环境变量 【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【将MySQL的bin目录路径追加到变值值中,用 ; 分割】 #四、初始化 mysqld --initialize-insecure #五、启动MySQL服务 mysqld # 启动MySQL服务 #六、启动MySQL客户端并链接MySQL服务 mysql -u root -p # 链接MySQL服务器 #七、将mysql添加系统服务 注意:--install前,必须用mysql启动命令的绝对路径 # 制做MySQL的Windows服务,在终端执行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --install # 移除MySQL的Windows服务,在终端执行此命令: "c:\mysql-5.7.16-winx64\bin\mysqld" --remove 注册成服务以后,之后再启动和关闭MySQL服务时,仅需执行以下命令: # 启动MySQL服务 net start mysql # 关闭MySQL服务 net stop mysql

1.解压tar包 cd /software #cd到一个本身建立的文件夹中 tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz #解压下载下来的mysql文件,若是没在这个文件夹中,记得把文件移动到这个文件夹中,经过mv指令 mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21 #经过mv指令给这个解压出来的文件改了个名字 2.添加用户与组 groupadd mysql #添加用户组 useradd -r -g mysql mysql #建立mysql用户,并添加到mysql用户组 chown -R mysql:mysql mysql-5.6.21 #这是mysql用户和mysql用户组的归属 chmod +x -Rf /usr/local/mysql #赐予可执行权限 3.安装数据库 su mysql cd mysql-5.6.21/scripts ./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data #使用mysql用户来将咱们下载并解压的那个mysql文件,安装到/software/mysql-5.6.21/data这个目录里面 4.配置文件 cd /software/mysql-5.6.21/support-files #配置文件在这个目录下 cp my-default.cnf /etc/my.cnf #copy一份my-default.cnf文件到etc目录下,并起名为my.cnf文件 cp mysql.server /etc/init.d/mysql #copy一份mysql.server文件,到etc的init.d的mysql文件夹中,启动加载的初始配置文件会有一部分在这个目录里面读取 vim /etc/init.d/mysql #若mysql的安装目录是/usr/local/mysql,则可省略此步 修改文件中的两个变动值 basedir=/software/mysql-5.6.21 #基础目录 datadir=/software/mysql-5.6.21/data #数据目录 5.配置环境变量 vim /etc/profile #环境变量的配置文件 ,添加下面两行 export MYSQL_HOME="/software/mysql-5.6.21" export PATH="$PATH:$MYSQL_HOME/bin" #使配置生效,经过source指令 source /etc/profile 6.添加自启动服务 chkconfig --add mysql chkconfig mysql on 7.启动mysql service mysql start 8.登陆mysql及改密码与配置远程访问 mysqladmin -u root password 'your_password' #修改root用户密码 mysql -u root -p #登陆mysql,须要输入密码 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; #容许root用户远程访问(默认远程链接是不能使用root用户来链接的) mysql>FLUSH PRIVILEGES; #刷新权限 9. 一些必要的初始配置(除了下面这些,未来玩mysql的时候还有不少不少的配置) 1)修改字符集为UTF8 vi /etc/my.cnf 在[client]下面添加 default-character-set = utf8 在[mysqld]下面添加 character_set_server = utf8 2)增长错误日志 vi /etc/my.cnf 在[mysqld]下面添加: log-error = /usr/local/mysql/log/error.log general-log-file = /usr/local/mysql/log/mysql.log 3) 设置为不区分大小写,linux下默认会区分大小写。 vi /etc/my.cnf 在[mysqld]下面添加: lower_case_table_name=1 修改完重启:#service mysql restart
在linux上使用mysql的时候,必定要注意的就是权限问题,linux恶心的地方就是权限问题。
2.mysql的简单使用演示
这里只是给你们演示一下mysql是个什么样子,具体怎么管理数据,后面咱们会学,这里只作演示用,由于演示一下以后,你对这个东西就有了一些简单的认识和了解,再进行后面的学的时候,你就不会摸着黑听理论了,所谓的瞎听了,哈哈。注意,咱们下面会输入一些指令进行操做数据库,数据库里面的指令必需要用;分号结尾,而后才能执行,切记。
1.开启服务端,mysqld\ net start mysql
2.使用mysql自带的客户端进行链接,cmd下输入mysql -u root -p,而后回车,会提示你输入密码,此时初始的root用户尚未密码,因此仍是直接回车就能够链接上了
3.show databases;先不讲里面的内容,说一下这是几个库,每一个项目能够有本身单独的一个库,里面放这个项目的全部数据表
4.建立一个库:create database CRM;而后show databases;查看一下就有了这个crm库,不分大小写,统一会变成小写,对照着咱们mysql安装目录下的data文件夹里面的内容看一下,库就是对应的文件夹。
5.咱们目前在全部数据库之上,想在咱们本身项目的库里面操做数据,就须要切换到咱们本身这个crm项目的库里面进行数据的操做,切换数据库使用use + 库名,例如:use crm;就提示你切换成功了。
6.咱们说过,库里面维护的数据就像一张一张的数据表,相似excel,对不对,那咱们建立一张表看一下,命令:
create table student(
id int,
name char(10),
age int
);
7.再执行show tables;就能够看到有了一个student表
8.查看一下这个表里的数据select * from student;发现什么数据也没有
9.插入几条数据,写几条数据:insert into student values(1,'d',18),(2,'x',11),(3,'d',10),(4,'k',9);而后回车,就执行了这条指令,而后咱们再查看一下这个表里面有没有数据了,执行上一条指令,select * from student;发现里面就有数据了:
结果:
mysql> select * from student;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | d | 18 |
| 2 | x | 11 |
| 3 | d | 10 |
| 4 | k | 9 |
+------+------+------+
4 rows in set (0.00 sec)
分析一下:上面这些就是mysql数据帮咱们保存的数据,以表格的外貌展现,第一行为表头,从第二行开始都是对应的数据,每列都是本身这一列规定的内容,好比id这一列是你插入的这几条数据的id,咱们这个insert就是插入数据,select就是查看数据,这就是咱们经过MySQL自带的客户端来操做的MySQL服务端来进行数据的操做。MySQL服务端和操做系统及硬盘打交道,快速的帮你实现数据的操做,其余的语言开发的客户端就是经过这种形式来操做数据库里面的数据的,未来咱们使用python操做数据库的时候,会使用一个叫作pymysql的工具来搞,到时候会给大家讲,他就是一个我们MySQL服务器的客户端,链接上服务端就能够操做服务端的保存的你的项目的数据了。例如用户要查看本身的信息,就经过你写的程序接受到客户的请求,经过本身的mysql客户端去MySQL服务端查看对应的信息,而后mysql服务端将这些信息发送给你的py程序客户端,你经过程序再将数据返回给你的用户,你的用户就看到了本身的信息,就是这么个过程,你们理解了吗。
真正的数据库维护优化等高级数据库的技术通常都是由公司的DBA来作,或者由比较懂数据库的运维来作,通常不会让开发来搞,除非你开发人员的数据库能力很强,这些NB的技术包括:数据库优化,数据库BUG解决,数据库备份(冷备、热备),保证数据不丢失,集群,高可用等等保证项目的稳定性和可用性及高并发用(不少的用户都来操做数据,你要并发),数据库各项配置参数的调优,慢sql语句的提炼和调优,数据库开发、数据库更新,数据迁移,数据恢复,分库分表等等,这些是数据库的高端技术,而针对开发人员,通常你须要学习这些:基本的开发环境使用的数据库搭建,而后增删改查就差很少了。固然若是想提高本身的能力和水平(还有薪资水平),数据库是你必需要学好的内容,可是那是你作开发以后的事情了,并且有好多同窗目前已经在数据库或者运维方面很NB了,可是开发还不行啊,对不对,哈哈,好好学python,数据库不是你学习python的重点,可是必需要会一些基本的内容,懂得越多越好,ok吗,同志们~~~
3.MySQL安装目录介绍
看图:
其中,咱们重点看一下data文件夹:若是你找不到本身创建的库或者表的文件,可能不在这个data文件夹下面,链接上mysql以后,输入show global variables like
"%datadir%"
;来查看数据文件存储路径,找到路径以后,到对应路径下若是找不到这个文件夹,那么多是隐藏的,把隐藏的文件显示一下就好了。
关于数据库中的这4个初始的库的详细介绍,有兴趣的同窗能够来看看个人这篇文章(目前做为了解用):https://www.cnblogs.com/clschao/articles/9928223.html
其中mysql这个库我须要提一下:
mysql:这个是mysql整个服务的核心数据库,相似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql本身须要使用的控制和管理信息。不能够删除,若是对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。
总结:其实这些库就是咱们电脑上对应的文件夹,在mysql中显示为对应的库,来方便咱们管理数据,而文件或者文件夹这种与硬盘打交道的事情就交给mysql了,咱们只须要对mysql库中的数据进行操做就能够了,你能够看到,咱们刚才简单使用的时候建立的一个crm库,也就是在data目录下的生成了一个crm文件夹。
说到这里,你们对数据库有个基本的了解了呢。那么咱们返回去看一下mysql的一些其余知识(提升逼格的内容~~),回到数据库分类及mysql介绍~~~~~
再怎么说咱们的root用户密码也不能为空啊对不对,因此须要设置一个密码,看下面设置密码的方法,我给了三种方法:
方法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功能,使用它来修改密码)
关于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下使用明文设置密码的时候,是不安全的,由于别人能够经过翻看你输入指令的历史记录来查看到你设置的密码,因此提示你一下,不信你按上下键,能够看到本身以前输入的命令,或者输入下面这个指令也能够看到:
因此咱们最好链接进入到mysql里面以后,在进行密码的修改和设置。
方法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用户的信息。
mysql> flush privileges; 刷新权限,让其生效,不然不生效,修改不成功。
在忘记root密码的时候,能够这样(注意:root密码最好不要忘记,找地方记录下来,否则若是是工做中大家使用的数据库(无论是测试的仍是线上的,都是比较麻烦的事情,数据库轻易不会让你重启的,不过做为一个开发来说,你应该是没法用root用户的~~~))
以windows为例:
1. 关闭正在运行的MySQL服务,net stop mysql(这个mysql是你添加的mysqld到系统服务时的服务名)。
2. 打开DOS窗口,转到mysql\bin目录。
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证,由于之因此mysql启动以后,客户端链接的时候须要登录认证,输入密码什么的,是由于mysql服务端启动的时候,加载了本身内部的一些权限相关信息的受权表、权限认证表什么的,这样就要求客户端必须有认证,若是启动的时没有加载这些表和设置,那么咱们客户端再进行登录的时候,就不须要认证了,那么就能够登录上了,登录以后,咱们到mysql这个存有全部用户信息的表中去修改root用户或者别的用户的密码了,仍是比较6的,可是这样搞须要关闭服务端,在实际工做中想关闭mysql服务??你以为可能吗??记住这个问题,我后面给你们解决。
注意一个问题,若是咱们直接使用的上面这个指令,也便是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窗口已经不能动了),转到mysql\bin目录。
5. 输入mysql回车,若是成功,将出现MySQL提示符 >。
6. 链接权限数据库: use mysql; 。
6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
7. 刷新权限(必须步骤):flush privileges; 。凡是涉及到密码修改或者后面咱们会学到的权限修改,修改完以后所有要再执行一下这一句。
8. 退出 quit。
9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登陆。
注意:咱们在使用cmd的时候,常常须要使用管理员身份来运行cmd窗口,每次都须要本身右键选择管理员身份运行,很麻烦,全部有永久解决的方法,看我下面的操做:
一、去”C:/Windows/System32”目录找到”cmd.exe”:
二、右击属性,选择“以管理员身份运行”:
永久解决办法:
一、建立“cmd.exe”快捷方式:
二、右击选择“属性”,选择“快捷方式”,再选择“高级”,在选择“以管理员身份运行”,再单击“肯定”。
之后只要打开快捷方式就能够以管理员的身份运行cmd了!
****总结一下*****,到目前为止,咱们已经大体了解mysql了,而且知道怎么使用自带的mysql客户端来链接mysql服务端,还知道怎么修改密码什么的了,那后面的咱们是否是就应该实战了呢,哈哈,实战以前,原本想带着你们使用xshell这个客户端工具来操做一下mysql,不过学它须要一些后面的知识,后面再学吧~~~不过还须要作一件事情,那就是数据库的编码问题,咱们知道本身写socket简单对话程序的时候还须要双方规定好编码方式,是gbk啊仍是utf-8啊等问题,否则容易报错或者乱码,对吧,mysql也存在这个问题,这个问题搞不清楚,未来大家学习、甚至工做中都会很是头疼~~~来,咱们就学一下怎么把mysql的编码调好~~~
使用数据库的时候要注意的字符集编码,其实主要的是中文乱码的问题,你们应该对编码比较熟悉了,双方沟通须要编码相同否则容易报错或者出现乱码的问题,在使用数据库的时候也会存在这样的问题,因此咱们须要解决这个问题:
先来模拟一下这个问题:
咱们将刚才的student数据表删除,咱们再来建立一个student表,而后往这个表里面插入几条含有中文的数据来看一下效果:
1.create table student(id int,name char(10),age int);
2.insert into student value(1,'呵呵',11),(2,'老刁',12),(3,'dsb',10),(4,'你好',9);
3.select * from student;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | ?? | 11 |
| 2 | ?? | 12 |
| 3 | dsb | 10 |
| 4 | ?? | 9 |
+------+------+------+
4 rows in set (0.00 sec)
发现什么问题,插入的中文怎么成了??号了,乱码了。。。
什么缘由呢?咱们先来看看咱们建立这个crm库的时候,是怎么建立的,输入查看库建立的是时候mysql内部实际执行的建立语句的指令(我们本身写了个指令,可是mysql在执行的时候会按照本身的方式来执行这个执行,如今就看看它实际执行的时候是个什么语句):show database crm\G;而后看结果:
mysql> show create database crm\G
*************************** 1. row ***************************
Database: crm
Create Database: CREATE DATABASE `crm` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.04 sec)
能够看到,咱们建立这个库的时候,mysql默认帮咱们指定了一个字符集:latin1,就是上面的后面半句DEFAULT CHARACTER SET latin1,建立库的时候默认指定了latin1的意思是,在这个库里面咱们建立的数据表,只要没有给表指定字符集,那么这个库里面的全部表都将是latin1字符集的(除了库建立的时候能够指定字符集以外,建立表的时候也能够指定字符集),来看一下建立表的时候,查看表建立语句的指令(此时咱们并无在建立表的时候指定字符集对吧):show create table student\G;看结果:
mysql> show create table student\G;
*************************** 1. row ***************************
Table: student
Create Table: CREATE TABLE `student` (
`id` int(11) DEFAULT NULL,
`name` char(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
发现建立表的时候,mysql也默认给咱们指定了一个字符集,也是latin1,由于库就是latin1的。
下面咱们来看一下MySQL的一些初始信息:经过指令(\s)来查看,注意只须要看里面的有关characterset的部分
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.6.42, for Win64 (x86_64)
Connection id: 12
Current database: crm
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.6.42 MySQL Community Server (GPL)
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: latin1 #服务端是latin1
Db characterset: latin1 #数据库默认是latin1
Client characterset: gbk #咱们如今用的客户端是gbk
Conn. characterset: gbk #双方链接也是gbk编码的,这个不用管
TCP port: 3306
Uptime: 4 days 18 hours 52 min 50 sec
Threads: 1 Questions: 88 Slow queries: 0 Opens: 70 Flush tables: 1 Open tables: 61 Queries per second avg: 0.000
--------------
上面看的不够清晰,那么咱们再看一下各个角色的编码(客户端、服务端,数据库等等):
在mysql中执行指令:show variables like '%char%';看结果:
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:\jj\mysql-5.6.42-winx64\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
关于上面这些编码的详细解释,看个人博客:https://www.cnblogs.com/clschao/articles/9946174.html,我就不给你们详细说啦。
那为何出现乱码问题呢?又如何解决乱码问题呢?
缘由:由于客户端mysql的字符集和服务端的字符集不同,注意一下其中的character_set_client、character_set_connection、character_set_results这三项,咱们在这里能够简单称为客户端三炮,就是由于这三炮和服务端的编码不一致致使的,因此咱们须要将这三项改成和服务端一致的字符集就能够了。
解决方案:
一.在插入数据以前,先执行一条指令:set names latin1;临时修改客户端三炮的字符集,让客户端插入数据的时候按照服务端的字符集编码来插入数据,而后咱们再插入一条数据,而后看效果:
mysql> set names latin1;
Query OK, 0 rows affected (0.14 sec)
而后咱们再查看一下编码:
mysql> show variables like "%char%";
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | F:\jj\mysql-5.6.42-winx64\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
发现客户端三炮都改成和服务端一致的latin1了,按照咱们刚才说的,按理说再插入数据应该就不会乱码了。来插入一条数据试试看:
mysql> insert into student value(5,'不乱了吧',111);
Query OK, 1 row affected (0.09 sec)
mysql> select * from student;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | ?? | 11 |
| 2 | ?? | 12 |
| 3 | dsb | 10 |
| 4 | ?? | 9 |
| 5 | 不乱了吧 | 111 | #再次插入的数据就不乱吗了,可是以前乱码的内容仍是乱码的内容
+------+----------+------+
5 rows in set (0.00 sec)
总结:在进行DQL和DML语句(关于DQL和DML的解释咱们后面会讲的,你就理解为一些sql语句)以前,先执行set names latin1;
可是咱们若是断开链接,退出数据库以后,在链接进来之后,插入数据时若是不执行set names latin1,仍是会乱码,说明这句指令没有让字符集永久生效。
不信,咱们退出一下,而后再链接进来看看:
mysql> quit
Bye
C:\Users\chao>mysql -uroot -p #链接进来
mysql> use crm; #切换库
Database changed
mysql> select * from student; #查看crm库中的student表中的数据
+------+-----------+------+
| id | name | age |
+------+-----------+------+
| 1 | ?? | 11 |
| 2 | ?? | 12 |
| 3 | dsb | 10 |
| 4 | ?? | 9 |
| 5 | ??????°? | 111 |
+------+-----------+------+
5 rows in set (0.00 sec)
发现仍是tm的乱码,真恶心啊,果真没有永久生效,咱们在使用一下set names latin1;而后再查看一下表中的数据
mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | ?? | 11 |
| 2 | ?? | 12 |
| 3 | dsb | 10 |
| 4 | ?? | 9 |
| 5 | 不乱了吧 | 111 |
+------+----------+------+
5 rows in set (0.00 sec)
发现第五条数据,也就是咱们以前使用latin1插入的数据,在查看以前使用set names latin1;仍是能够看到对应的不乱码的数据的,由于咱们就是以latin1的字符集插入的,只是查看的时候客户端三炮仍是以前的gbk的编码,因此直接查看结果的时候仍是乱码的。
这样虽然能够解决乱码问题,可是没办法永久解决乱码问题,因此每次在进行sql语句输入以前都要先执行一下set names latin1;(latin1这里代指的是服务端的字符集,不必定就是latin1),因此咱们还有其余的方法来解决,修改配置文件,看第二种方法!
注意一点:若是想把以前已经乱码的数据改成不乱码,在工做中,咱们须要将数据所有导出来,而后从新建库建表,再把数据导进来。
二.在配置文件里面修改客户端和服务端参数,能够实现set names latin1;的效果,而且永久生效
首先回答一个问题:至于为何MySQL中的编码是latin1,是由于这是人家mysql规定好的,并写在本身的运行程序中的,只要mysql启动的时候,咱们没有给人家指定一个字符集,那么它就会按照本身程序中写好的这个字符集来运行。
因此,咱们若是想永久的更改mysql的字符集(无论是客户端仍是服务端的),就须要在mysql服务端启动以前给人家指定好,具体怎么指定呢,就须要看一下mysql启动的时候加载本身程序文件的过程(在并发编程的时候咱们说过,任何程序运行都是经过加载本身的程序文件运行起来的),看看加载了哪些文件,而且哪些文件是关于mysql字符集的,咱们只须要将这个关于字符集的文件里面的内容修改一下,就至关于间接的告诉mysql运行加载的时候须要使用的字符集格式。那么咱们就能够作到永久修改mysql的字符集了,对不对。好,针对这个思路,咱们研究了一下发现,这个包含字符集配置的配置文件叫作my.ini文件(win10,unix叫作my.cnf),这个文件是mysql启动的时候加载的一些用户自定制配置的文件,那么咱们能够经过这个配置文件来改一改字符集,除了能填写字符集的配置项以外,还能填写一些你本身想要定制的其余的内容(须要研究mysql官方手册了~~)。
若是你的安装目录里面没有这个文件而且没有在其余地方设置,那么mysql就会按照本身默认的配置参数来运行,咱们能够经过写一个my.ini文件来指定,mysql运行起来时会读取这个my.ini文件中的一些配置,其中就能够配置指定字符集。
咱们知道这个文件叫作my.ini文件了,可是这个文件写在哪里呢?这里咱们再说一个问题:有的人的博客上说mysql在启动的时候使用的配置文件在这个目录下(以win10举例):
可是我查看了一下mysql启动的时候对my.ini文件的加载顺序:
发现并无加载上面这个文件夹中的my.ini文件,而且我测试了一下,将上面文件夹中my.ini文件中的mysqld下面的默认端口号3306改成了3307,而后我启动了mysql服务,而后我查了一下端口号,发现3307这个端口并无被使用:
因此验证出上面的这个文件夹中的文件并无被加载生效。因此我肯定,上面这个文件夹中的配置文件只是一个参考用的,我称它为伪配置文件。并非有些博客里面的mysql中加载的那个my.ini文件。
而且咱们经过上面的查看my.ini文件的加载顺序中看到,咱们本身mysql的安装目录中的my.ini文件就是其中一个加载顺序的结果,因此,看样子咱们本身在本身的mysql的安装目录下写一个my.ini文件就应该能行了,来就按照这个思路搞一搞(和你们肯定说一下,这样确定是能够的~~~)
首先在安装目录下建立一个my.ini文件(copy一份my-default.ini文件,更名为my.ini文件),使用Notepad++打开,里面写上下面的内容,来看看是否是会生效
以前咱们链接mysql服务端的时候的指令是 mysql -uroot -p回车,其实咱们直接输入mysql而后回车就能链接上mysql服务端,可是用户并非root,而是mysql给咱们建立一个用户,没啥用,能够忽略,工做中这个用户确定是要被删除了,咱们先来看一下这个用户,经过select user()来查看,并非咱们的root用户,root用户链接的时候是须要填密码的。
以前咱们用root用户链接输入库的命令是这样的:
C:\Users\chao>mysql -uroot -p
Enter password: ***
咱们在咱们建立的my.ini文件中写上下面几行,而后保存:
[mysql] #配置客户端链接的时候,指定一下用户名和密码,那么咱们在进行mysql客户端链接的时候,直接输入mysql而后回车就能够了,而且用户是咱们下面指定的root用户
user=root
password=666
重启mysql服务(通常修改配置文件,让其生效,须要重启服务,可是我测试了一下,这个用户名和密码的指定,貌似不须要重启服务就能够的):
而后再起一个cmd客户端,直接输入mysql而后回车,再查看一下用户:
改成root用户了~~~~配置文件生效~~~~
经过上面的实验,咱们知道,咱们能够经过my.ini文件中的配置项,来更改mysql系统的一些服务,实现一些自定制配置,其实可以完成的配置很是多,未来深刻学习mysql的时候,这个配置文件很关键,不过对于如今只作开发的你,就没必要去研究那么多了,若是想看一下均可以进行哪些配置,能够参考一下个人那个centos7.1下安装mysql的博客最后面的内容,有关于其中的不少配置及解释,还能够参考上面咱们提到的那个伪配置文件里面的内容来搞,可是记住一点,你写的这些配置必须是mysql可以认识的,也就是要按照人家规定的变量名称来配置,好比上面咱们配置的用户名和密码,就叫作user和password,不能是username什么的,这个记住啦。
下面咱们经过配置文件来搞一搞编码,终于到了这一步了(windows和linux都是这个配置)
在配置以前咱们看一下各个角色的编码,还记得查看指令吗:
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:\jj\mysql-5.6.42-winx64\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
好,咱们来改一改my.ini配置文件,文件中的内容写法,写完以后保存,而后重启mysql系统服务:
#强调:配置文件中的注释能够有中文,可是配置项中不能出现中文
#在mysql的解压目录下,新建my.ini,而后配置
#1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效
[mysqld]
character_set_server=utf8
collation-server=utf8_general_ci #就是一个校对规则,通常默认都是这个,若是不是就改为这个就能够了,因此直接写上就好了,这个规则后面咱们会讲的~~~
还能够配置好多内容,好比下面的端口号,基准路径,数据文件路径:
port=3306 # mysql服务端默认监听(listen on)的TCP/IP端口
basedir="C:/Program Files/MySQL/MySQL Server 5.5/" # 基准路径,其余路径都相对于这个路径
datadir="C:/Program Files/MySQL/MySQL Server 5.5/Data" # mysql数据库文件所在目录
#2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效
[client]
default-character-set=utf8
#3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置
[mysql]
user=root
password=666
default-character-set=utf8
#若是没有[mysql],则用户在使用mysql系统自带的mysql客户端来执行mysql命令时的配置以[client]为准
重启mysql服务,让配置文件生效:
C:\WINDOWS\system32>net stop mysql
MySQL 服务正在中止..
MySQL 服务已成功中止。
C:\WINDOWS\system32>net start mysql
MySQL 服务正在启动 .
MySQL 服务已经启动成功。
而后链接进入mysql,再次查看编码:
C:\Users\chao>mysql -uroot -p
Enter password: ***
mysql> show variables like "%char%";
+--------------------------+-------------------------------------------+
| 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 | F:\jj\mysql-5.6.42-winx64\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
编码都编程utf8了,verygood,编码统一了,咱们再来插入一条数据看看:
首先咱们将以前的crm库删除,而后再从新建立一个crm库,并在crm库里面从新建立一个student表,为何删除呢?由于前面咱们说了,以前的数据是乱码的,没办法改,因此咱们先删除吧,而后从新建立一个,以前建立的crm库是Latin1的字符集的,因此为了简单演示,咱们就删除从新建立吧,这里注意,若是未来大家公司使用的数据库的编码确实有问题,而且和大家如今要使用的编码不一致,那么就须要使用第一种临时修改字符集的方式来插入和查询数据,没办法,要否则就要重塑数据库,将编码调节好。
来操做一下看看效果:
首先看一下以前的crm库的建立语句:
mysql> show create database crm\G
*************************** 1. row ***************************
Database: crm
Create Database: CREATE DATABASE `crm` /*!40100 DEFAULT CHARACTER SET latin1 */
1 row in set (0.08 sec)
仍是latin1的字符集
mysql> drop database crm; #删除以前的crm库
Query OK, 1 row affected (0.41 sec)
mysql> show databases; #查看一下,crm库没有了
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database crm; #从新建立
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| crm |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
查看建立时的语句:
mysql> show create database crm\G
*************************** 1. row ***************************
Database: crm
Create Database: CREATE DATABASE `crm` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.00 sec)
已经改成了utf8的字符集
而后咱们插入数据,查看数据,看一下效果:
mysql> use crm;
Database changed
mysql> create table student(id int,name char(10),age int);
Query OK, 0 rows affected (0.47 sec)
mysql> insert into student value(1,'呵呵',11),(2,'老刁',12),(3,'dsb',10),(4,'你好',9);
Query OK, 4 rows affected (0.10 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from student;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 | 呵呵 | 11 |
| 2 | 老刁 | 12 |
| 3 | dsb | 10 |
| 4 | 你好 | 9 |
+------+--------+------+
good,彻底没有乱码了~~~这就是解决方案
总结:不乱码的思想:系统的编码、客户端、服务端、库、表、列,这几项的编码都要统一才不会出现乱码的状况。
附赠:
windows系统查看系统默认编码的指令:
cmd窗口状况下:windows下cmd默认的编码是GBK
想在windows下查看sqlite的utf-8中文须要先 执行chcp 65001把当前页换为utf-8编码
chcp 命令:
chcp 65001 就是换成UTF-8代码页,在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改成True Type字体"Lucida Console",而后点击肯定将属性应用到当前窗口
chcp 936 能够换回默认的GBK
chcp 437 是美国英语
linux系统查看系统默认编码的指令:
执行指令:cat sysconfig i18n
结果中有一条是:LANG="zh_CN.utf8"
有了mysql这个数据库软件,就能够将程序员从对数据的管理中解脱出来,专一于对程序逻辑的编写。
mysql服务端软件即mysqld帮咱们管理好文件夹以及文件,前提是做为使用者的咱们,须要下载mysql的客户端,或者其余模块来链接到mysqld,而后使用mysql软件规定的语法格式去提交本身命令,实现对文件夹或文件的管理。该命令的语法即sql(Structured Query Language 即结构化查询语言),sql语句又分为几类,具体看个人博客:https://www.cnblogs.com/clschao/articles/9930802.html,主要分为4中,DDL、DQL、DML、DCL。
SQL语句主要是针对数据库里面三个角色进行操做,对象是:库、表、行,操做包括:增删改查。
一、库(data文件夹中的文件夹,每建立一个库,这个库的名称就是文件夹的名称,文件夹里面保存着一些这个库相关的初始信息)
增:create database db1 charset utf8; #建立一个库,能够指定字符集
查:show databases; #查看数据库中全部的库
show create database db1; #查看单独某个库db1的信息
改:alter database db1 charset latin1; #修改库的字符集,注意语句的格式(其余语句也是这么个格式),alter(修改) database(修改数据库) db1(哪一个数据库) charset(字符集) latin1(改为哪一个字符集)
删除: drop database db1; #删除数据库
二、表(操做文件,表是上面库文件夹里面的文件)
先切换库:use db1; #要操做表文件,要先切换到对应的库下才能操做表
查看当前所在的是哪一个库:select database();
增:create table t1(id int,name char(10) ); #建立表的时候,和excel同样,须要有字段啊,每一个字段还须要只能一下这个字段数据的格式,这里指定的是两个字段列,id和name列,id和name是列名(字段名),id 后面的int的意思说id这一列中的数据只能是int类型的,name后面的char的意思是,name这一列中的数据只能是char类型的(char表示定长字符串类型),char里面的10是说这个字段的长度最长为10个字符,若是不指定这个长度,默认长度是1,注意是字符而不是字节,这些字段的内容咱们后面会详解,这里知道一下就好啦。
#在建立表的时候,咱们去看一下mysql安装目录里面的data文件夹里面的db1文件夹里面的文件,而后咱们执行建立表的指令,看看db1文件夹里面的变化,多了两个文件,分别是:db1.frm,db1.ibd文件,建立了一张表为何会多了两个文件呢,这两个文件都是啥呢?看解释(里面涉及到存储引擎,关于存储引擎咱们后面会讲的~~):

1.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息 2.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息; 3.后缀名为.MYD(MYData)的文件:从名字能够看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息; 4.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息; 5.ibdata1文件:主要做用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。 从上面能够看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,.MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢? 主要区别是再于数据库的存储引擎不同,若是储存引擎采用的是MyISAM,则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎若是是innoDB,开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,若是采用共存储模式的,数据信息和索引信息都存储在ibdata1中; 在进行数据恢复的时候,若是用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去便可。可是若是是innodb的话,则每个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才能够。 msyql人家设定的规则就是这样存储表的,使用人家的系统,就要理解人家的规则。
查:show tables; #查看当前库中全部的表
show create table t1; #查看单表的建立信息
#还能够经过下面两句来查看表信息,以表格的形式展现结果:
desc t1;
describe t1;#上下这两句是同样的结果
改:alter table t1 modify name char(3); #修改字段属性的,将name字段的char长度改成3,改完以后咱们在用上面的show create table t1;desc t1;describe t1;来查看一下修改结果。
alter table t1 change name name1 char(2);
删:drop table t1;
3. 行(操做文件(表)中的内容/记录)(*****未来的重中之重)
增:insert into t1 values(1,'dsb1'),(2,'dsb2'),(3,'dsb3'); #往t1表中插入三行数据,注意你插入的每行内容都要和你建立表的时候的字段个数和字段属性对应好,注意每行数据以逗号分隔。
insert后面的into能够不用写。
查:select * from t1; #查看t1表中全部字段的数据,select 字段 from 表。
select id,name from t1;#查看t1表中的id和name列的数据,其余的不看,注意格式,每一个字段逗号分隔,在cmd窗口下只是展现给咱们看,未来咱们经过程序获取查询数据的时候,就能够这么获取,查询字段的顺序也是能够颠倒的,name,id这样也是能够的。
注意还有一个问题,看下图:当你写sql语句的时候,可能会出现下面这种状况,因为少写了一个引号,致使怎么也结束不了
改:update t1 set name='sb' where id=2; #把id为2的行(记录)中的name字段的数据改成sb;id>1;id<=1;等等均可以。后面会细讲的~~~
update t1 set name='sb',id=88 where id>2; #对两个字段进行修改
update t1 set name='sb';#若是不指定where,那么会name字段的全部数据都改为sb。
删:delete from t1 where id=1; #删除id为1的行
清空表:
delete from t1; #若是有自增id,新增的数据,仍然是以删除前的最后同样做为起始。
truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,
auto_increment 表示:自增
primary key 表示:约束(不能重复且不能为空);加速查找
至此,咱们你们认识了一下简单的SQL语句,下来你们练一练吧~~~明天咱们针对库、表、行的操做来一些详细的讲解,其实库的内容很少,主要是表和行,最主要是行。