---
# System prepended metadata

title: Day26 Golang MySQL安裝 資料庫的幻想與介紹

---

# Day26 Golang MySQL安裝 資料庫的幻想與介紹  

> 想當年，還沒學資料庫之前，對未知的**資料庫**一詞這充滿了憧憬與想像，  
> 覺得這就是塞了一堆資料的地方，但不曉得原理是怎麼塞的，  
> 可能是用了外星科技或各種黑魔法吧。  
> 直到上了資料庫的課，老師打破了我對資料庫的幻想。  

> 順帶一提，過了一個學期之後，那位老師開始教作業系統，  
> 再度破滅了原先我對**作業系統**異想天開的構想。  
> 但老師實在是教的很棒，真是愛恨交加。  

`資料庫(Database)`分成非常多種：

* 星狀資料庫
* 關聯式資料庫
* 階層式資料庫
* 物件導向資料庫
* ...

但最常用到的是`關聯式資料庫(Relational Database)`簡稱RDB，以及`非關聯式資料庫(NoSQL)`（NOSQL不是沒有SQL，也不是對SQL說`NO`，而指的是`Not Only SQL`）  

## DB、SQL、RDBMS 的關係
DB 是**資料庫**，是一群數據的集合體，數據所在的位置，不管存了什麼都叫資料庫。  
（DBA 是**資料庫管理員**，負責資料庫的維護、備份、安全管理的人。） 

SQL 是**結構化查詢語言**，是一種程式語言，語法關鍵字有`SELECT`、`INSERT`、`WHERE`、`DROP` 等等，用來操作關聯式資料庫。  

RDBMS 是**關聯式資料庫管理系統**，是實作出來可以支援SQL語法的系統、服務，如`MySQL`、`SQLite`、`MariaDB`、`Oracle Database`、`Access` 等等。   

NoSQL 是相對於RDBMS的 **非關聯式資料庫管理系統**，也有非常眾多的系統，如`Redis`、`memcached`、`MongoDB` 等等，其中有支援`鍵值(Key–value)`的、也有支援`JSON格式`的。  

---

關聯式資料庫基本上就是`Microsoft Office 的 Excel`，都是二維的表格，都有行列欄位。  
只不過用法更加的靈活，可以設置 唯一識別 `主鍵(Primary Key)`， 不可重複 `Unique` 等等條件。


# 安裝MySQL

![MySQL](https://i.imgur.com/9i7ke77.png)  

MySQL 是一個系統、一項服務。  

要跑起服務前，當然需要在電腦上下載與安裝。  

安裝方法多到數不清。  
MySQL目前出到8.0版本了。  
以下會統一把最高權限帳戶root的密碼改成`root`  

#### Windows

除了可以下載 [**MySQL官網**](https://dev.mysql.com/downloads/installer/) 來安裝，  

也可以下載簡單好用的 [**XAMPP**](https://www.apachefriends.org/zh_tw/download.html) 來啟動MySQL服務，
#### XAMPP (Windows)
![XAMPP](https://i.imgur.com/kc1WzSN.png)  

XAMPP的MySQL預設密碼為空，  
點擊`Shell`，將root帳號的密碼為`root`   

    $ mysqladmin.exe -u root password root  

這裡也要做更改  
![my.ini](https://i.imgur.com/YLc84L1.png)  
![password](https://i.imgur.com/KQXwsbx.png)  

如果日後會用到`phpmyadmin`介面的話，這邊也要改做修改  
![phpmyadmin](https://i.imgur.com/ppcB2Ul.png)
![phpmyadmin password](https://i.imgur.com/Iwrb51N.png)

接著重啟MySQL服務。  

#### MacOS

用`Homebrew`來安裝執行  
    
    $ brew install mysql@8.0  
    $ brew services start mysql@8.0  
    
更改root密碼    

    $ /usr/local/bin/mysqladmin -u root password root

登入MySQL

    $ mysql -u root -p

（要結束MySQL的話）  
    
    $ brew services stop mysql@8.0  

#### Docker
也可以用跨平台的`Docker Container`方式：  
把container命名為`mysql_test`  
將密碼預設為root    

    $ docker run --name=mysql_test -d -p 3306:3306 --env MYSQL_ROOT_PASSWORD=root mysql:8.0

登入MySQL
    
    $ docker exec -it mysql_test mysql -uroot -p 

（要結束MySQL的話）  
    
    $ docker container rm  -f mysql_test
---

MySQL服務預設會開在Server端的`3306 Port`。  
而Server端儲存的root密碼是root，  
Client端連進去的密碼就要是root，否則無法登入。  
安裝完成、也確認過可以用帳號密碼root/root登入後，便可以開始來寫程式。  


在這邊`Server端`跟`Client端`指的都是自己目前的電腦。  

接下來會以程式的方式來模擬Client端，Client端能對Server端進行登入、操作資料等等。  

但在用Golang 模擬 Client端的行為之前，要先安裝驅動Driver，否則不能支援地    

#### [Go-MySQL-Driver]https://github.com/go-sql-driver/mysql  

    $ go get -u github.com/go-sql-driver/mysql


連線MySQL的第一支程式。

以下運行成功的話不會出現任何東西。  

```go
package main

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql" //為什麼要用底線_來占著位子？
	"log"
)

func main() {
	dbConnect, err := sql.Open(
		"mysql",	// 因為只有這裡才用到這個`引數`，並沒有直接使用到了mysql.XXX 相關的函式或物件，會被認為沒有用到mysql這個依賴而 被go編譯器省略import 
		"root:root@tcp(127.0.0.1:3306)/",
	)
	
	if err != nil {
		log.Fatalln(err)
	}

	err = dbConnect.Ping() //Ping() 這裡才開始建立連線。上面 sql.Open 只建立物件、容器，並未進行連線，無法連線並不造成err。
	if err != nil {
		log.Fatalln(err)
	}
}

```

> `Open()` may just validate its arguments without creating a connection to the database. 
> To verify that the data source name is valid, call `Ping()`.


沒開啟服務、沒連接到MySQL的話會出現：`dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine actively refused it.`  

密碼錯誤會出現：`Error 1045: Access denied for user 'root'@'localhost' (using password: YES)`  

沒有import Driver：`sql: unknown driver "mysql" (forgotten import?)`
