前言
PHP 與 MySQL 是經典的 Web 開發組合。本文系統整理使用 PHP 建立 MySQL 資料庫、資料表的完整流程,涵蓋語法、範例程式碼、資料型態選擇與主鍵設計等核心知識點,適合初學者快速上手與工程師查閱參考。
一、建立資料庫
SQL 語法
CREATE DATABASE database_name;
PHP 實作範例
<?php
$con = mysqli_connect("localhost", "peter", "abc123");
if (!$con) {
die('連線失敗: ' . mysqli_connect_error());
}
$sql = "CREATE DATABASE my_db";
if (mysqli_query($con, $sql)) {
echo "資料庫建立成功";
} else {
echo "建立失敗: " . mysqli_error($con);
}
mysqli_close($con);
?>
注意:舊版 mysql_* 函數已棄用,現代專案請使用 mysqli_* 或 PDO。
二、建立資料表
SQL 語法
CREATE TABLE table_name (
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
...
);
PHP 實作範例:建立 person 表
<?php
$con = mysqli_connect("localhost", "peter", "abc123");
if (!$con) {
die('連線失敗: ' . mysqli_connect_error());
}
// 先選擇資料庫
mysqli_select_db($con, "my_db");
$sql = "CREATE TABLE person (
FirstName VARCHAR(15),
LastName VARCHAR(15),
Age INT
)";
if (mysqli_query($con, $sql)) {
echo "資料表建立成功";
} else {
echo "建立失敗: " . mysqli_error($con);
}
mysqli_close($con);
?>
三、MySQL 常用資料型態詳解
選擇正確的資料型態關係到儲存效率與查詢效能,以下分類整理:
數值型態
| 型態 | 說明 | 適用場景 |
| TINYINT | -128 ~ 127 (無號號 0~255) | 狀態旗標、小範圍計數 |
| SMALLINT | -32768 ~ 32767 | 中小範圍整數 |
| MEDIUMINT | -8388608 ~ 8388607 | 中等範圍整數,比 INT 省 25% 空間 |
| INT | -2147483648 ~ 2147483647 | 通用整數、主鍵 ID |
| BIGINT | ±9.22×10¹⁸ | 大數值、時間戳毫秒 |
| DECIMAL(m,d) | 精確小數,m 總位數,d 小數位 | 金額、價格、精確計算 |
| FLOAT / DOUBLE | 單/雙精度浮點數 | 科學計算、近似值 |
字串型態
| 型態 | 最大長度 | 特性 | 適用場景 |
| CHAR(n) | 255 字元 | 固定長度,不足補空格 | MD5、UUID、固定代碼 |
| VARCHAR(n) | 65,535 位元組 | 變長,實際長度+1~2 位元組 | 名稱、標題、一般文字 |
| TINYTEXT | 255 字元 | 不需指定長度 | 短備註 |
| TEXT | 65,535 字元 | 長文本 | 文章內容、描述 |
| MEDIUMTEXT | 16,777,215 字元 | 中等長文本 | 長文檔 |
| LONGTEXT | 4,294,967,295 字元 | 超長文本 | 完整書籍、日誌 |
日期時間型態
| 型態 | 格式 | 範圍 | 備註 |
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 純日期 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 純時間 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 日期時間,8 位元組 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 4 位元組,時區感知 |
| YEAR | YYYY | 1901 ~ 2155 | 年份 |
特殊型態
- ENUM('v1','v2',...):最多 65,535 個枚舉值,單選,儲存為整數索引,極省空間。
- SET('v1','v2',...):最多 64 個成員,可多選,位元組合儲存。
- BLOB 系列:二進位資料(TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB),對應 TEXT 系列大小。
四、主鍵與自動遞增設計
核心原則
- 每個表必須有主鍵,唯一識別每一列。
- 主鍵值不可為 NULL,且唯一。
- 主鍵自動建立索引,無需額外定義。
- 慣用整數型態 +
AUTO_INCREMENT。
建表範例:帶主鍵的 person 表
$sql = "CREATE TABLE person (
personID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (personID),
FirstName VARCHAR(15),
LastName VARCHAR(15),
Age INT
)";
mysqli_query($con, $sql);
五、最佳實踐建議
- 優先使用最小足夠的型態:如 MEDIUMINT 替代 INT,節省 25% 空間。
- 避免將數字存為字串:影響排序、比較與索引效能。
- 能用 NOT NULL 就不用 NULL:每欄省 1 bit,查詢優化器更易判斷。
- 固定長度表考慮 ROW_FORMAT=FIXED:無 VARCHAR/TEXT/BLOB 時可加速讀取。
- 非多語系欄位用 latin1:比 utf8mb4 省 3 倍空間(如 email、URL、IP)。
六、常見錯誤與除錯
- 忘記 mysqli_select_db():建表前必須先選擇資料庫。
- VARCHAR 未指定長度:會報錯,必須如
VARCHAR(15)。
- 使用已棄用的 mysql_* 函數:PHP 7.0+ 已移除,請改用 mysqli 或 PDO。
- 未檢查回傳值:務必判斷
mysqli_query() 是否成功。