Database
Database
2019/12/14 (增補內容)
2024/04/30 (增補參考資料)
2024/05/06 (增補參考資料)
2024/05/21 (增補參考資料)
資料庫相關概念
Schema (database)
Character Set (如:utf-8)and Collation(如:utf8_unicode_ci) (詳參: http://www.codedata.com.tw/database/mysql-tutorial-7-charset-database/ 、MySql varchar 要使用 utf8_general_ci, utf8_unicode_ci 還是 ascii_bin 呢)
Table
Column
Data type (詳參: http://www.codedata.com.tw/database/mysql-tutorial-8-storage-engine-datatype/, https://www.w3schools.com/sql/sql_datatypes_general.asp, https://www.w3schools.com/sql/sql_datatypes.asp)
Int
Float, Double, Decimal
VarChar vs. Char
Date
General attributes (詳參: http://www.codedata.com.tw/database/mysql-tutorial-9-table-index/ )
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語法以外的語法或函數,所以,要注意跨資料庫的語法差異。
SQL語法簡介
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 )
中文的設定
** 一般而言,都不需要設定,如果有問題,請檢查
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
參考資料
無法啟動
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);
![](https://www.google.com/images/icons/product/drive-32.png)
在學校
啟動mysql
使用phpMyAdmin
建立資料庫
建立資料表
新增資料
更改資料
更改欄位
匯出資料庫
匯入資料庫