1. 資料庫基本概念
參考資料: mysql pdf
- 在 PHP 動態網頁的應用中, 有相當多情況需要 儲存資料。例如帳號密碼、產品規格…等, 此時除了將資 料儲存在檔案之外, 為了提高讀寫的效率與程 式設計上的簡便, 我們會採用資料庫系統, 將資 料的讀寫都交由資料庫系統來處理。
- 資料庫系統又可分為兩個部份:資料庫 (Database) 與資料庫管理系統 (DataBase Management System, DBMS)
- 資料庫是儲存資料的地方。一個資料庫系統中 可以有多個資料庫, 每個資料庫都是一組經過 整理好的資料集合。 一般, 我們會將資料庫想像成是一個存放資料 的容器, 但資料庫的真實型態其實是一個個的 電子檔案 (file)。 資料庫管理系統則是指管理資料庫的軟體, 它 們負責使用者與資料庫之間的溝通, 如存取資 料庫中的資料、以及管理資料庫的各項事務等。
- 關聯式資料庫是由資料表 (Table) 所組成, 資料 會分類儲存在各個資料表中。
- 資料型別:MySQL 目前共有 3 大類的資料型 別:字串、數字、日期時間, 以下摘要介紹各 類別中常用的資料型別。 (1) 字串型別 下表中, n 表示可儲存的最大字元數 (稱為長 度), L 表示實際儲存的字元數:
- 使用字串型別時, 如果使用英美語系的編碼 (MySQL 中的編碼取決於字元集的設定), 則通 常 1 個字元只佔用 1 bytes。但是如果使用 Big5、UTF8…等多位元語系, 1 個字元可能是 1 ~ 3 個 bytes。 CHAR 具有固定長度的特性, 而 VARCHAR 的 長度則會視儲存的字元數而變動。舉例來說, 假設在字元型別的欄位中存入 3 個 字元, 若該欄位設定為 CHAR (8), 仍然會佔用 8 個字元的空間, 如果是 VARCHAR (8), 則只 會佔用 3 個字元 + 1 byte 空間。不過, 因為 VARCHAR 是變動的長度, 所以存 取的速度會比 CAHR 慢。
<tips>
在電腦裡面, 如果我們以有電來代表1, 沒電來代表0,
不管是什麼資料, 都是以0或是1來儲存,
也就是最基本的單位, 我們稱這個基本單位為bit.
而1與0, 就是二進位制, 因此數位系統使用2進位制.
使用一個bit來表示資料就只能表示0跟1, 這樣太少了,
所以我們一次使用一組bit來表示資料,
在通用的電腦環境中是使用八個bit, 所以可以表示0~ 2的8次方種資料,
從00000000(二進位) ~ 11111111(二進位)
也就是0~255, 總共256種資料,
這個是數位系統裡面通用的,基本的資料類型 稱之為byte.
bit跟byte都是計算記憶體空間的單位.
在不同的情況下, 會使用其中的一種作為單位.
比如說一般我們說RAM有多大, 會用byte為單位.
而網路設備的流量, 廠商通常用bit為單位.
回到你說的字元. 一個字元佔多少容量呢?
也就是說, 一個字元佔多少byte?
這取決於你怎麼去定義一個字元.
比如說, 我們現在決定用byte為字元的單位, 那一個字元就佔1個byte.
舉個例子, 電腦系統裡面的ASCII碼就是以1個byte為單位儲存字元,
在ASCII編碼裡面,
01000001(二進位) 就代表 A
01000010(二進位) 就代表 B
01000011(二進位) 就代表 C
你可以去網路上搜尋一下ASCII碼, 那就可以找到這個對應表.
所以我們如果要存ABC這三個字, 就要花費3個bytes.
另外一種通用的編碼方式, unicode, 則是以4個bytes為單位,
所以一個字元就是4bytes, 你要存ABC這三個字, 就要花費12個bytes
至於這個佔多少空間, 可能說的是硬碟空間, 記憶體空間,
甚至是頻寬的單位, 就看你的資料現在在哪裡啦~
(2) 數字型別 數字型別可細分為整數型別與浮點數型別, 分 別用來存放整數與小數, 以下將分別說明: 整數:下表中, n 為顯示寬度:
整數型別可以設定顯示寬度, 用來設定要顯示的 位數。 例如設定 INT (3), 表示其顯示時的寬度至少為 3 位數, 如果位數不足則 MySQL 會自動補上空 白, 所以存入 “1” 時會顯示 “_ 1” ( 代表空白)、 存入 “56” 時會顯示 “_56”。請注意, 顯示寬度與範圍大小並無相關, INT (3) 欄位依然可以存入 “12345” 這個值, 顯示時也會 是 “12345”。
浮點數:下表中, m、d 用來定義有效位數:
浮點數型別能夠使用 FLOAT (m, d)、 DECIMAL (m, d) 的方式來定義有效位數, 其中 m 代表最大長度 (整數加小數), d 表示小數長度 。 故 DECIMAL (5, 2) 可以儲存 XXX.dd 這種 2 位小數的 5 位數字。如果沒有定義, DECIMAL 預設使用 DECIMAL (10, 0)。
請注意, FLOAT 內部運作是以近似值的方式來 儲存數字, 所以 FLOAT 可能會在某些數字失去 精確度。 而 DECIMAL 則是精確儲存數字, 所以如果用於 財務、成績…等用途, 建議使用 DECIMAL 型別。使用數字型別時, 若指定 UNSIGNED 屬性, 則 表示無負數值。UNSIGNED 會影響整數型別的大小範圍, 但是 對於浮點數則不影響範圍, 僅能限定該欄位使用 正數。
除了 UNSIGNED 屬性以外, 數字型別還可以設 定 ZEROFILL 屬性, 可以在不足顯示寬度或有 效位數的部分補上 0。例如將 “123” 存入帶有 ZEROFILL 屬性的 INT (5) 欄位, 取出時會變成 “00123”。將 “12.3” 存入帶有 ZEROFILL 屬性的 DECIMAL (7, 3) 欄位, 取出時會變成 “0012.300”。
如果要儲存日期或時間, 可以使用以下型別:
2. 基本操作
- 查看並增加databases
mysql> create databases test1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'databases test1' at line 1
mysql> create database test1;
Query OK, 1 row affected (0.05 sec)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
- 新增tables
mysql> use test1
Database changed
mysql>
mysql>
mysql> create table mytable(school char(5),name char(10),id int);
Query OK, 0 rows affected (0.33 sec)mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| mytable |
+-----------------+
1 row in set (0.01 sec)mysql> describe mytable;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| school | char(5) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| id | int(11) | YES | | NULL | |
+--------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 新增資料
mysql> select * from mytable ;
Empty set (0.00 sec)mysql> insert into mytable(school, name, id) values ('NCTU','Jerry','123');
Query OK, 1 row affected (0.08 sec)mysql> select * from mytable ;
+--------+-------+------+
| school | name | id |
+--------+-------+------+
| NCTU | Jerry | 123 |
+--------+-------+------+
1 row in set (0.00 sec)mysql> insert into mytable values ('NTC','Cabie','001');
Query OK, 1 row affected (0.07 sec)mysql> select * from mytable ;
+--------+-------+------+
| school | name | id |
+--------+-------+------+
| NCTU | Jerry | 123 |
| NTC | Cabie | 1 |
+--------+-------+------+
2 rows in set (0.00 sec)
- 更新資料
mysql> update mytable set name = 'Pizza' where id = '123';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from mytable ;
+--------+-------+------+
| school | name | id |
+--------+-------+------+
| NCTU | Pizza | 123 |
| NTC | Cabie | 1 |
+--------+-------+------+
2 rows in set (0.00 sec)
- 刪除資料
delete from mytable where name = 'Pizza';
- 改變資料欄位 (加入時間記錄)
mysql> alter table mytable add column recordtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql>
mysql>
mysql> select * from mytable ;
+--------+-------+------+---------------------+
| school | name | id | recordtime |
+--------+-------+------+---------------------+
| NCTU | Pizza | 123 | 2018-11-06 23:01:35 |
| NTC | Cabie | 1 | 2018-11-06 23:01:35 |
+--------+-------+------+---------------------+
2 rows in set (0.00 sec)
- 資料表查詢+條件+排序 (DESC 代表由大到小排序)
mysql> select * from mytable where id = '123' order by name DESC;
+--------+-------+------+
| school | name | id |
+--------+-------+------+
| NCTU | Pizza | 123 |
+--------+-------+------+
1 row in set (0.00 sec)
- 查看port
[root@centosclean ~]# netstat -tulpn | grep mysql
tcp6 0 0 :::33060 :::* LISTEN 1770/mysqld
tcp6 0 0 :::3306 :::* LISTEN 1770/mysqld
3. python + Mysql
- 安裝pymysql
! python -m pip install --upgrade pip
! pip install pymysql
- 創建bimap用戶 參考資料: Host ‘xxx.xx.xxx.xxx’ is not allowed to connect to this MySQL
mysql> CREATE USER 'bimap'@'localhost' IDENTIFIED BY '!QAZxsw2';
Query OK, 0 rows affected (0.08 sec)
mysql> exit[root@centosclean log]# systemctl restart mysqld
[root@centosclean log]# mysql -u bimap -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.13 MySQL Community Server - GPLCopyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
- 用python讀取版本mysql.py 參考資料:Python 操作 MySQL 数据库
import pymysql#db = pymysql.connect(host='localhost', port=3306, user='bimap', passwd='!QAZxsw2', db='30days', charset='utf8')
db = pymysql.connect(host='localhost',port=3306,user='bimap',passwd='!QAZxsw2',charset='utf8')#建立操作游標
cursor = db.cursor()
#SQL語法(查詢資料庫版本)
sql = 'SELECT VERSION()'
#執行語法
cursor.execute(sql)
#選取第一筆結果
data = cursor.fetchone()print ("Database version : %s " % data)
#關閉連線
#db.close()#輸出:Database version : 5.6.35[root@centosclean ~]# python3 mysql.py
Database version : 8.0.13
4. phpMyAdmin
參考資料: Centos7 安裝phpMyAdmin 但另外要安裝php
yum install php