MySQL 是 PHP 開發最核心的儲存引擎。本文系統整理資料類型選擇、常用操作指令、用戶權限管理、資料庫/表結構操作,作為開發隨查手冊。
| 類型 | 儲存 | 有號範圍 | 無號範圍 | 建議用途 |
|---|---|---|---|---|
| TINYINT | 1B | -128~127 | 0~255 | 布爾旗標、極小枚舉、狀態碼 |
| SMALLINT | 2B | -32,768~32,767 | 0~65,535 | 較小計數、年齡、小範圍 ID |
| MEDIUMINT | 3B | -8,388,608~8,388,607 | 0~16,777,215 | 中等計數、中型表主鍵 |
| INT | 4B | -2.14B~2.14B | 0~4.29B | 標準主鍵、外鍵、通用計數 |
| BIGINT | 8B | -9.22E18~9.22E18 | 0~1.84E19 | 海量資料主鍵、時間戳毫秒、大計數 |
最佳實踐:UNSIGNED 非負業務優先;INT UNSIGNED 存 IPv4(配合 INET_ATON/NTOA);避免 INT(11) 誤以為長度限制,括號僅為顯示寬度。
| 類型 | 儲存 | 精度 | 適用場景 |
|---|---|---|---|
| FLOAT | 4B | ~7 位有效數字 | 科學計算、近似值、座標 |
| DOUBLE | 8B | ~15 位有效數字 | 高精度科學計算 |
| DECIMAL(M,D) | M+2B | 精確至 D 位小數 | 金額、價格、比率、任何不可捨入場景 |
鐵律:涉及金錢務必用 DECIMAL,FLOAT/DOUBLE 二進制表示導致 0.1+0.2≠0.3 等精度問題。
| 類型 | 儲存 | 最大長度 | 特性 | 選擇建議 |
|---|---|---|---|---|
| CHAR(M) | M B | 255 字元 | 定長、右側空格填充 | 固定長度:MD5、UUID、國家代碼、性別 |
| VARCHAR(M) | L+1/2B | 65,535 字元 | 變長、長度前綴 | 不定長文字:名稱、標題、描述、URL |
| TINYTEXT/TEXT | L+1/2B | 255/65,535 字元 | 不支援 DEFAULT、需前綴索引 | 較長文本:文章、日誌、JSON 片段 |
| MEDIUMTEXT | L+3B | 16,777,215 字元 | 同上 | 長文本 |
| LONGTEXT | L+4B | 4,294,967,295 字元 | 同上 | 超長文本 |
| ENUM | 1-2B | 65,535 成員 | 單選、內部存數字 | 固定狀態集:狀態機、優先級(慎用,ALTER 修改貴) |
| SET | 1-8B | 64 成員 | 多選、位元組合 | 標籤、權限位掩碼(慎用,查詢不直觀) |
字符集:預設 utf8mb4 支援 Emoji,utf8 僅 3 字節不支援補助平面字符。
| 類型 | 儲存 | 格式/範圍 | 特性 | 選擇建議 |
|---|---|---|---|---|
| DATE | 3B | 1000-01-01 ~ 9999-12-31 | 純日期 | 生日、紀念日、截止日 |
| TIME | 3B | -838:59:59 ~ 838:59:59 | 純時間/時長 | 營業時間、耗時統計 |
| DATETIME | 8B | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 無時區、靜態 | 建立時間、業務發生時間(精確到秒) |
| TIMESTAMP | 4B | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 時區感知、自動初始化/更新 | 優先選擇:修改時間、版本控制、日誌(4B 省空間) |
| YEAR | 1B | 1901 ~ 2155 | 純年份 | 年份欄位 |
TIMESTAMP 自動屬性(5.6.5+ 可多欄位):
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP:建立與更新自動賦值DEFAULT CURRENT_TIMESTAMP:僅建立自動賦值DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP:僅更新自動賦值mysql -h host -u user -p[password] -P port -D database
# 常用簡寫
mysql -uroot -p123456 -h127.0.0.1 -P3306 -Dmydb
| 參數 | 長參數 | 說明 |
|---|---|---|
| -h | --host | 伺服器主機 |
| -u | --user | 用戶名 |
| -p | --password | 密碼(-p 後無空格直接接密碼,或留空提示輸入) |
| -P | --port | 連接埠(大寫 P) |
| -D | --database | 預設資料庫 |
| -E | --vertical | 垂直顯示結果(適合寬表) |
| -H | --html | HTML 表格輸出 |
| -X | --xml | XML 輸出 |
| --prompt | 自訂提示符,如 mysql> → \u@\h [\d]> |
exit | quit | \q | Ctrl+D
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
-- 建立(指定字符集/校對)
CREATE DATABASE [IF NOT EXISTS] db_name
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看建立語句
SHOW CREATE DATABASE db_name;
-- 切換
USE db_name;
-- 刪除(謹慎!)
DROP DATABASE [IF EXISTS] db_name;
-- 列出所有
SHOW DATABASES;
-- 建表範例
CREATE TABLE `user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(32) NOT NULL UNIQUE,
`email` VARCHAR(128) NOT NULL,
`password_hash` CHAR(60) NOT NULL, -- bcrypt 輸出固定 60 字元
`status` TINYINT UNSIGNED NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 查看結構
DESC `user`;
SHOW CREATE TABLE `user`;
-- 修改表
ALTER TABLE `user`
ADD COLUMN `avatar_url` VARCHAR(255) DEFAULT NULL AFTER `email`,
MODIFY COLUMN `status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=正常 2=禁用',
DROP COLUMN `obsolete_col`,
ADD INDEX `idx_email` (`email`),
ADD UNIQUE INDEX `uk_username` (`username`);
-- 刪表
DROP TABLE [IF EXISTS] `user`;
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
CREATE USER 'readonly'@'10.0.%.%' IDENTIFIED BY 'ReadOnlyPass!';
-- 開發/應用帳號:增刪改查 + 結構變更
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX
ON mydb.* TO 'app_user'@'%';
-- 唯讀帳號:報表、備份、分析
GRANT SELECT, SHOW VIEW
ON mydb.* TO 'readonly'@'10.0.%.%';
-- 管理員:全權限(含 GRANT OPTION)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- 刷新生效
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app_user'@'%';
SHOW GRANTS; -- 當前用戶
REVOKE INSERT, UPDATE ON mydb.* FROM 'app_user'@'%';
DROP USER 'old_user'@'%';
-- 版本
SELECT VERSION();
-- 當前資料庫
SELECT DATABASE();
-- 當前用戶
SELECT USER(), CURRENT_USER();
-- 字符集/校對
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- 進程列表
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
-- 引擎狀態
SHOW ENGINE INNODB STATUS;
-- 表狀態
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'];
MySQL 基礎功力決定上層應用穩定度。核心記住:
ALTER TABLE 完成多欄位/索引變更,減少鎖表重建次數。將此文加入書籤,下次選型、建表、授權時隨查隨用。