day 35初識數據庫

一.數據庫概述
1.什麼是數據庫?先來看看百度怎麼說的.
數據庫,簡而言之可視爲電子化的文件櫃——存儲電子文件的處所,用戶能夠對文件中的數據運行新增、截取、更新、刪除等操做。
    所謂「數據庫」系以必定方式儲存在一塊兒、能予多個用戶共享、具備儘量小的冗餘度、與應用程序彼此獨立的數據集合。
百度的貌似很差理解啊,讓我說啊,數據庫是存儲數據的地方,你這不是廢話麼?你你你你你說的對,哈哈,存數據的地方是存在哪裏呢,存在硬盤上,爲何不是存在內存裏面,由於內存沒法永久保存。以前咱們存數據都是使用的文件,在一個word文檔裏面寫一些羞羞的網址,而後保存,就存儲到硬盤上了。有同窗就會說了,我這經過文件不是也將數據保存上了嗎?是的,沒毛病,可是你想,經過文件來操做數據,效率是否是很低,首先打開關閉就比較慢,其次是咱們操做起來也比較麻煩,對不對,若是我想記錄一條關於我我的信息的數據,我使用文檔來存,是否是很不友好,而且咱們要查數據的時候,看圖1:圖1是一個word裏面記錄的信息,若是我想查詢出全部人的名字,這個操做是否是就很難搞定了,來來來,配合起來~~,你應該說是的,那我就接着說,有同窗可能就會說了,老師我用excel啊,看圖2,一列就搞定了,沒毛病,可是你想打開操做excel效率低不低。而且經過你本身寫的程序來操做這些文件是否是很麻煩,就大家學的open函數。其實效率低的緣由是由於咱們知道文件都是保存在硬盤上的,硬盤的效率自己就低,因此沒辦法.
因此,爲了方便的管理這些數據,又能提升對數據的管理效率,各個公司就開始想辦法了,喊出了口號:咱們要寫一套軟件,專門管理數據!!,讓應用程序或者說項目程序不直接和硬盤打交道了,讓咱們本身寫的管理數據的軟件來操做數據,而且咱們寫的軟件要解決下面幾個問題:1.直接操做硬盤上的文件效率低 。 2. 經過操做文件來讀寫數據很麻煩。 3. 咱們本身的電腦上寫的程序和咱們本身電腦上存儲的數據都在這一臺電腦上了,想和別人共享一個數據或者一個文檔也是比較麻煩的,而且若是和別人共享,那麼可能形成本身電腦的安全性變低了,可是公司內部的項目可能就會使用一些共同的數據啊,這樣共享起來就很麻煩。 4. 項目和數據若是都在一個電腦上,例如京東,若是有一天,京東的項目出問題了,或者部署這個項目的電腦(服務器)崩了,你的數據是否是就麻煩了,嗯,穩定性和安全性都不夠,咱們要把數據和項目分開管理,通常公司都會這麼作,看下圖:
經過上面這個圖裏面的思想,貌似解決了共享數據和數據穩定性的問題,可是專門管理數據的機器裏面仍是將數據存到硬盤上啊,若是項目直接和硬盤打交道,效率仍是差啊,而且雖然數據共享起來了,咱們經過前面的學習知道,數據共享起來就會出現數據不安全的問題和數據混亂的問題啊,怎麼辦,加鎖!並且不少項目或者人均可能過來鏈接中間這個存放數據的機器啊,咱們不能讓全部人都能鏈接這個機器啊,怎麼辦,加鏈接驗證!而且要作好備份,由於如今數據多重要啊,因此還要支持作數據備份的工做!多我的鏈接使用這個機器中的數據的時候,還要支持併發啊,每一個人的感受都是本身單獨的在操做這個機器啊,怎麼辦,支持併發!
  哎,想要好好的玩數據,還真是tm的麻煩,不過各個公司都不怕艱難,都在努力的搞事情,搞一套能夠高效管理數據的工具,稱之爲數據庫管理軟件/系統(應用軟件)
  又出來一個新詞啊,數據庫管理系統,來,先看看百度怎麼解釋的
數據庫管理系統(英語:Database Management System,簡稱DBMS)是爲管理數據庫而設計的電腦軟件系統,
通常具備存儲、截取、安全保障、備份等基礎功能。數據庫管理系統能夠依據它所支持的數據庫模型來做分類,例如關係式、XML;
或依據所支持的計算機類型來做分類,例如服務器羣集、移動電話;或依據所用查詢語言來做分類,例如SQL、XQuery;
或依據性能衝量重點來做分類,例如最大規模、最高運行速度;亦或其餘的分類方式。不論使用哪一種分類方式,一些DBMS可以跨類別,例如,同時支持多種查詢語言。
貌似又是很差理解,來吧,通俗解釋--> 這個工具負責來和硬盤打交道(固然中間還隔着操做系統),高效的管理數據,而且還支持對外通訊,網絡通訊都是基於的socket,也就是說它還至關於一個socket服務端,那麼想來到這個存數據的機器上來操做數據的人或者項目均可以鏈接到這個工具,並經過這個工具來管理數據,那麼咱們就能夠經過下面這個圖來看看這工具的工做方式:
上面這個圖是否是就一目瞭然了,這個數據管理系統咱們稱之爲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,看解釋
 
1.結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈes kjuː ˈel/ "S-Q-L"),是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名。
2.結構化查詢語言是高級的非過程化編程語言,容許用戶在高層數據結構上工做。它不要求用戶指定對數據的存放方法,也不須要用戶瞭解具體的數據存放方式,因此具備徹底不一樣底層結構的不一樣數據庫系統, 能夠使用相同的結構化查詢語言做爲數據輸入與管理的接口。結構化查詢語言語句能夠嵌套,這使它具備極大的靈活性和強大的功能。
3.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  其餘不經常使用關係型數據庫

  


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)數據庫

常見的非關係型數據庫java

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行數據庫
  二、純內存數據庫
  三、持久化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介紹
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或者性能瓶頸,則能夠開始考慮做爲任何業務數據服務的後端數據庫軟件。
 

   好了,同志們,鋪墊了這麼多,咱們要開始學習實戰內容啦,來看第四大節,修改密碼~~

  

 
三.Mysql的下載安裝,簡單應用及目錄介紹
 1.下載安裝
    win10系統下安裝說明:
#一、下載: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

  

Linux系統下安裝說明:
 
這裏只作安裝的一個說明,下載的話根據本身實際狀況到官網下載就能夠了,提醒一點:在linux上使用mysql的時候,必定要注意的就是權限問題,linux噁心的地方就是權限問題。
  2.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

  

    這裏只是給你們演示一下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個初始的庫的詳細介紹,有興趣的同窗能夠去網上自行了解(目前做爲了解用)
  其中mysql這個庫我須要提一下:
      mysql:這個是mysql整個服務的核心數據庫,相似於sql server中的master表,主要負責存儲數據庫的用戶、權限設置、關鍵字等mysql本身須要使用的控制和管理信息。不能夠刪除,若是對mysql不是很瞭解,也不要輕易修改這個數據庫裏面的表信息。
  總結:其實這些庫就是咱們電腦上對應的文件夾,在mysql中顯示爲對應的庫,來方便咱們管理數據,而文件或者文件夾這種與硬盤打交道的事情就交給mysql了,咱們只須要對mysql庫中的數據進行操做就能夠了,你能夠看到,咱們剛纔簡單使用的時候建立的一個crm庫,也就是在data目錄下的生成了一個crm文件夾。
  說到這裏,你們對數據庫有個基本的瞭解了呢。那麼咱們返回去看一下mysql的一些其餘知識(提升逼格的內容~~),回到數據庫分類及mysql介紹~~~~~
四.root用戶密碼設置及忘記密碼的解決方法
  再怎麼說咱們的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)
 
    爲何出現亂碼問題呢?又如何解決亂碼問題呢?
      緣由:由於客戶端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"

 

 
     
六.初始sql語句
  有了mysql這個數據庫軟件,就能夠將程序員從對數據的管理中解脫出來,專一於對程序邏輯的編寫。
  mysql服務端軟件即mysqld幫咱們管理好文件夾以及文件,前提是做爲使用者的咱們,須要下載mysql的客戶端,或者其餘模塊來鏈接到mysqld,而後使用mysql軟件規定的語法格式去提交本身命令,實現對文件夾或文件的管理。該命令的語法即sql(Structured Query Language 即結構化查詢語言),sql語句又分爲幾類,主要分爲種: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
2
3
4
5
6
7
8
9
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語句,接下來我會針對庫、表、行的操做來一些詳細的講解,其實庫的內容很少,主要是表和行,最主要是行,都是固定的命令,多練習,記住就能夠了!!!
相關文章
相關標籤/搜索