PHP 操作 MySQL 資料庫是後端開發核心技能。熟悉建表語句、資料型態選擇、約束設計,能避免後期遷移修改的高昂成本。本文整理常用 MySQL 建表語法與型態對照,供快速查閱。
CREATE TABLE `persons` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵 ID',
`last_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '姓氏',
`first_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '名字',
`email` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '電子郵件',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '電話',
`birth_date` DATE DEFAULT NULL COMMENT '生日',
`balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '餘額',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '啟用狀態',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_last_name` (`last_name`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='人員基本資料表';
| 分類 | 型態 | 儲存範圍/長度 | 適用場景 | 備註 |
|---|---|---|---|---|
| 整數 | TINYINT | -128~127 / 0~255 (UNSIGNED) | 布林旗標、極小計數 | 1 位元組 |
| SMALLINT | -32768~32767 | 小範圍計數 | 2 位元組 | |
| MEDIUMINT | -8388608~8388607 | 中等計數 | 3 位元組 | |
| INT / INTEGER | -2147483648~2147483647 | 標準 ID、計數 | 4 位元組,最常用 | |
| BIGINT | ±9.22e18 | 大量 ID、時間戳毫秒 | 8 位元組 | |
| 定點數 | DECIMAL(M,D) | 精確至 D 位小數 | 金額、價格、比率 | 字串儲存,精確運算 |
| NUMERIC | 同 DECIMAL | 同上 | 同義詞 | |
| 浮點數 | FLOAT / DOUBLE | 近似值 | 科學計算、座標 | 不適合金額 |
| 日期時間 | DATE | 1000-01-01 ~ 9999-12-31 | 生日、截止日 | 3 位元組 |
| TIME | -838:59:59 ~ 838:59:59 | 時間段 | 3 位元組 | |
| DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 完整時間點(無時區) | 8 位元組,5.6+ 支援微秒 | |
| TIMESTAMP | 1970-01-01 ~ 2038-01-19 (UTC) | 自動記錄建立/更新時間 | 4 位元組,含時區轉換 | |
| 字串 | CHAR(N) | 固定 0~255 字元 | MD5、UUID、國家代碼 | 右側空格填充 |
| VARCHAR(N) | 可變 0~65535 字元 | 一般文字、名稱 | 1-2 位元組長度前綴 | |
| TEXT / MEDIUMTEXT / LONGTEXT | 65535 / 16M / 4G 字元 | 長文本、文章內容 | 離頁儲存,避免 SELECT * | |
| 二進制 | BINARY / VARBINARY | 同 CHAR/VARCHAR | 檔案雜湊、加密資料 | 位元組比較 |
| BLOB 系列 | 同 TEXT 系列 | 圖片、檔案二進制 | 建議存檔案路徑而非內容 | |
| JSON | JSON | 約 1G | 半結構化資料、動態屬性 | 5.7+ 原生支援,可索引虛擬欄位 |
| ENUM | ENUM('a','b','c') | 預設值集合 | 狀態機、固定分類 | 內部存數字索引,效能佳 |
| SET | SET('a','b','c') | 多選值集合 | 標籤、權限位元組 | 內部存位元遮罩 |
| 引擎 | 支援交易 | 支援外鍵 | 鎖粒度 | 適用場景 |
|---|---|---|---|---|
| InnoDB | 是 | 是 | 行鎖 | 預設、OLTP、高併發、資料完整性要求高 |
| MyISAM | 否 | 否 | 表鎖 | 唯讀/讀多寫少、全文搜尋(5.6+ InnoDB 也支援) |
| MEMORY | 否 | 否 | 表鎖 | 暫存表、查找表、Session(資料重啟消失) |
| ARCHIVE | 否 | 否 | 行鎖 | 日誌、歸檔、僅追加寫入 |
<?php
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4',
'user', 'pass',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
$sql = <<exec($sql);
echo "Table created/verified.\n";
良好的表結構設計是系統穩定擴展的基石。掌握資料型態精準選擇、約束完整定義、索引科學規劃、字元集統一規範,配合 PHP PDO 安全執行 DDL,即能構建經得起時間考驗的資料層。