2019/12/14 (增補內容)
2024/04/30 (增補參考資料)
2024/05/06 (增補參考資料)
2024/05/21 (增補參考資料)
2024/07/31 (補充內容)
2024/10/17 (更新投影片)
2024/10/31 (更新內容)
2024/10/17 (更新內容)
在學校
啟動mysql
使用phpMyAdmin
建立資料庫
建立資料表
新增資料
更改資料
更改欄位
匯出資料庫
匯入資料庫
Schema (database)
Character Set (如:utf-8)and Collation(如:utf8_unicode_ci) (詳參: MySQL 超新手入門(7)字元集與資料庫 、MySql varchar 要使用 utf8_general_ci, utf8_unicode_ci 還是 ascii_bin 呢)
Table
Column
Data type (詳參: MySQL 超新手入門(8)儲存引擎與資料型態, SQL Data Types for MySQL, SQL Server, and MS Access)
Int
Float, Double, Decimal
VarChar vs. Char
Date
General attributes (詳參: MySQL 超新手入門(9)表格與索引 )
Not Null
Signed vs. unsigned
Auto Increment
Primary Key
Relationship
Foreign Key
Constraint
MySQL語法:
CREATE TABLE `practice`.`job` (
`postid` INT NOT NULL AUTO_INCREMENT ,
`company` VARCHAR(45) NOT NULL ,
`content` TEXT NOT NULL ,
`pdate` DATE NOT NULL ,
PRIMARY KEY (`postid`));
在標準的SQL語法 (SQL-92)裡,當資料表的名稱或者欄位名稱是關鍵字(如:order、group、desc)或有空白的時候,可以使用double quote ("),然而,很多程式語言使用double quote (")來表示字串,會造成系統開發上的困擾。所以,很多資料庫就會使用其他的方式來表達。MySQL可以利用backtick (`),在微軟的SQL server及Access裡,使用的是[]。
要避免跨資料庫的問題,建議資料表的名稱或者欄位名稱不使用關鍵字(如:order、group、desc)或空白。
SQL語法:
CREATE TABLE practice.job (
postid INT NOT NULL AUTO_INCREMENT ,
company VARCHAR(45) NOT NULL ,
content TEXT NOT NULL ,
pdate DATE NOT NULL ,
PRIMARY KEY (postid));
另外,不少的資料庫也提供一些標準的SQL語法以外的語法或函數,所以,要注意跨資料庫的語法差異。
Function
MySQL 超新手入門
SQL (詳參: https://www.w3schools.com/sql/)
select * from job;
select * from job where company = 'apple';
select * from job where company like '%p%';
insert into job (company, content, pdate) values ('Apple', 'Programmer', '2019-08-29');
update job set company='Apple', content='PHP Programmer', pdate='2019-08-29' where postid=1;
delete from job where postid=1;
資料表或欄位盡量不要使用保留字 (如:code、date、desc、div、order) (詳參: https://dev.mysql.com/doc/refman/5.5/en/keywords.html )
比較常用的關聯式資料庫有SQL server,、MySQL、MariaDB、Oracle database。雖然都支援SQL,但在SQL語法上還是有些差異 (詳參: MySQL to SQL Server Coding Differences )。
MySQL是一個開源的資料庫,原本是由MySQL AB開發,2008年被Sun收購,2009年Oracle收購Sun時,就變成Oracle的產品了,MySQL最新版本是8.4.0 (2024/05/06更新) (下載: MySQL Community Downloads)(詳參:MySQL)。
MariaDB是MySQL的一個分支,在2013年由MySQL的創始人Ulf Michael Widenius與其他人一起成立了MaribDB Foundation來主導MariaDB的開發。在MariaDB 5.5之前,MariaDB的版本都與MySQL同步,後來MariaDB就跳到10.0,並且,MariaDB就與MySQL版本不再同步。目前最新的穩定版本是11.3.2 (2024/05/06更新)(下載: Downloads) (詳參: MariaDB)。
一般而言,可以直接下載MySQL或Maria DB,也可以下載一些安裝包(如:XAMPP、AppServ),這些安裝包將這些軟體包裝好,可以一次安裝好,不必一個一個的安裝。使用安裝包的時候要注意,每個安裝包所內含的軟體是不太一樣的,目前最大的差異在於使用MySQL或MariaDB,例如,XAMPP內含MariaDB,AppServ內含MySQL,WampServer則是MySQL及MariaDB,另外,還要注意的是支援的作業系統,AppServ及WampServer支援windows,XAMPP號稱跨平台,所以,支援Windows、Mac、Linux版本。
常用的管理介面有phpmyadmin及MySQL WorkBench,可採用phpmyadmin,因為phpmyadmin是個web介面,而且是用php開發,一定要有apache伺服器才能執行,所以,phpmyadmint通常會包含在Appserv及XAMPP裡。
XAMPP支援Windows、Mac、Linux版本(詳參: XAMPP安裝與操作初步 、XAMPP v7.3.6 網頁伺服器自動架站機 ),XAMPP支援的是MariaDB,不過,介面上還是寫MySQL。XAMPP透過phpmyadmin來管理mysql。
另外,如果希望使用獨立的管理介面,可以使用MySQL Workbench,MariaDB10.0以後的版本跟MySQL不相容,所以,如果使用MariaDB10.0以後的版本,MySQL WorkBench就可能會有相容性的問題了。
如何使用MySQL Workbench (詳參: MySQL Workbench Manual )
針對中文,常用的字符集有 GB2312、GBK、GB18030、UTF8 等。由於 UTF8 良好的國際化特性,推薦在無特殊理由時,都使用 UTF8 編碼。
MySQL中針對utf8mb4字符集,提供了很多排序規則,常用的有:
utf8mb4_general_ci:MySQL預設的排序規則,Unicode 部分未嚴格按 Unicode 順序排序
utf8mb4_unicode_ci:按照 Unicode 字符順序排序
utf8mb4_0900_ai_ci:按照 Unicode 9.0 的字符順序排序,包括基本多語言平面之外的字符
** 一般而言,都不需要設定,如果有問題,請檢查
my.ini/my.cnf for utf-8 (一般而言,windows是使用C:\xampp\mysql\bin\my.ini C:\AppServ\MySQL\my.ini,Mac或linux 使用/etc/my.cnf 或 /etc/mysql/my.cnf,不過,如果是直接安裝MySQL server的話,那就要看 : MySQL – Locate the Configuration File – my.ini or my.cnf on Windows Platform )
可利用以下的sql檢查設定:
show variables like 'char%';
查到的結果應該是:
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir C:\AppServ\MySQL\share\charsets\
如果不是,那就要把my.ini修改為:
[mysqld]
## UTF 8 Settings
character_set_server=UTF8MB4
有些版本是使用減號
[mysqld]
## UTF 8 Settings
character-set-server=UTF8MB4
以及
[mysql]
default-character-set=UTF8MB4
如果怎麼改變數的內容都沒變,那可能是改錯設定檔了。
** 如果使用phpmyadmin,一般設定下,伺服器連線編碼與排序要改成utf8mb4_unicode_ci
在[mysqld]底下,需要:
[mysqld]
## UTF 8 Settings
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
有些版本,在[client]底下,需要:
[client]
default-character-set=utf8mb4
有些版本,在[mysql]底下,需要:
[mysql]
default-character-set=utf8mb4
PHP存取資料庫有幾種方法:第一種是原始的mysql,但是,從2012年之後就不再支援了,第二種是MySQLi (MySQL improved),第三種是PDO (PHP Data Objects),PDO支援MySQL以外的資料庫。MySQLi只支援MySQL,因為我們通常都會使用MySQL,再加上MySQLi支援程序性(procedural)的語法,而PDO只支援物件導向語法,所以,這門課就教大家使用MySQLi。不過,這裡稍微介紹一下三種語法的差異。以設定連結為例:
mysqli_connect()接受三個參數,資料庫伺服器的名稱、資料庫的帳號、資料庫的密碼。
$conn = mysqli_connect($servername, $username, $password);
利用mysqli類別產生一個物件,產生物件時,一樣傳遞三個參數: 資料庫伺服器的名稱、資料庫的帳號、資料庫的密碼。
$conn = new mysqli($servername, $username, $password);
利用跟MySQLi物件導向的語法滿類似的,利用pdo類別產生一個物件,產生物件時,一樣傳遞三個參數,但是,因為要能套用到不同的資料庫,第一個參數就不是資料庫伺服器的名稱,而是資料庫伺服器的連結,不同資料庫的連結格式是不一樣的。其他兩個參數一樣是: 資料庫的帳號、資料庫的密碼。
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
介紹這三種語法的目的是要讓大家知道這三種語法不能混用,所以,當大家去google或者利用生成是人工智慧產生程式碼的時候,就要很小心,雖然表面上都是取得一個$conn的變數,但是,變數的使用方式與後續使用的語法是不一樣的,所以,在同一個php程式裡是不能混用三種語法。
Troubleshooting Problems Starting the MySQL Server
有問題可以開啟data資料夾裡的.err檔案,可以看到錯誤訊息
Repairing MariaDB Tables for SQL Server Users
可利用check table、repair table指令
To repair an InnoDB table after a crash:
Restart MariaDB with the --innodb-force-recovery option set to a low but non-zero value.
If MariaDB fails to start, retry with a higher value. Repeat until you succeed.
安裝 MySQL 與設定真・UTF-8 編碼 (2023) **
應該設為UTF8MB4
請直接在 MySQL 裡面直接用 utf8mb4 取代 utf8 (2019)
utf8 應該是 4 byte 的字符,不過 mysql 裡面的 utf8 只有支援 3 byte。
處理使用php讀取mysql中文亂碼問題 (2017)
通常利用php讀取mysql產生亂碼時,可能有幾種原因:
mysql資料庫設定
網頁編碼設定
mysql設定query為utf8編碼
理解MySQL中的字符集和排序規則 (2023)
目前推薦使用utf8mb4_0900_ai_ci或者utf8mb4_unicode_ci。
MariaDB支援utf8mb4_unicode_520_ci,但不支援utf8mb4_0900_ai_ci,直接跳uca1400_as_cs
MySQL 資料庫schema中文的Collation要選擇什麼? (2018)
在MySQL建立新的schema時,如果要儲存中文,請選擇utf8mb4_unicode_ci。
PHP PDO程式碼使用範例 (php 5.3.6以前的寫法)
//PDO的連接語法
$pdo = new PDO("mysql:host=$db_server;dbname=$db_name",$db_user,$db_password);
//設定為utf8編碼,必要設定
$pdo->query('SET NAMES "utf8"');
5.3.6以後的寫法 (詳參: Set charset on PDO connection with mysql in PHP)
$pdo = new PDO("mysql:host=$db_server;dbname=$db_name;charset=utf8",$db_user,$db_password);