整理 MySQL 日常開發中最易踩坑的細節,涵蓋連線、建庫表、字元集、大小寫敏感、資料型別選型、CRUD 語法細節、LIKE 模糊查詢、LIMIT 分頁。
mysql -h localhost -u root -p # 退出:EXIT / QUIT / Ctrl+C
# Shell 下 (mysqladmin)
mysqladmin -u root -p'oldpass' password 'newpass'
# SQL 下 (需 FLUSH PRIVILEGES)
SET PASSWORD = PASSWORD('newpass'); -- 5.6
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; -- 5.7+
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
/etc/my.cnf:character-set-server=utf8mb4、collation-server=utf8mb4_general_ci。SHOW TABLES FROM db; 或 USE db; SHOW TABLES;DESCRIBE tbl; (常用) vs SHOW CREATE TABLE tbl\G (完整 DDL)CREATE TABLE IF NOT EXISTS articles ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, content TEXT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DROP TABLE tbl FROM db;| 類別 | 型別 | 空間 | 範圍/精度 | 適用場景 |
|---|---|---|---|---|
| 整數 | TINYINT | 1B | -128~127 / 0~255 | 布爾、狀態碼、小枚舉 |
| SMALLINT | 2B | -32768~32767 | 較小範圍計數 | |
| MEDIUMINT | 3B | -8388608~8388607 | 中等計數 | |
| INT | 4B | -21億~21億 | 通用主鍵、計數 | |
| BIGINT | 8B | -9穰~9穰 | 大流水號、分散式 ID | |
| 浮點 | FLOAT | 4B | 7 位有效數字 | 科學計算、非精確金額 |
| DOUBLE | 8B | 15 位有效數字 | 高精度科學計算 | |
| 定點 | DECIMAL(M,D) | M+2B | 精確至 D 位小數 | 金額、價格、比率 (必用!) |
| 字串 | CHAR(M) | M B | 0~255 字元 | 固定長度:MD5、UUID、郵遞區號 |
| VARCHAR(M) | L+1/2B | 0~65535 字元 | 變長:標題、名稱、描述 (首選) | |
| 文本 | TEXT | 64KB | 長文本 | 文章、日誌、JSON 片段 |
| 時間 | DATETIME | 8B/5B | 1000~9999 年 | 建立時間、業務時間 (不受時區影響) |
| TIMESTAMP | 4B | 1970~2038 年 | 更新時間、自動維護欄位 (受時區影響) |
核心原則:能用較小型別就不用大型別;金額必用 DECIMAL;變長優先 VARCHAR (節省空間、減少碎片)。
INSERT INTO t (title) VALUES ('test');
DELETE FROM t WHERE id = 1;
UPDATE t SET title = 'new' WHERE id = 2;
SELECT * FROM t WHERE title LIKE '%keyword%' ORDER BY id DESC LIMIT 0, 10;
LIMIT offset, count:offset 從 0 開始,LIMIT 10 OFFSET 20 同義。LIKE:% 匹配任意長度、_ 匹配單一字元。LIKE 'a%' 前綴可用索引,LIKE '%a%' 全掃。SELECT * FROM t WHERE title REGEXP '^[0-9]+$'; -- 純數字標題 -- MySQL 8.0 支援 ICU 正則,功能更強
# 配置檔 lower_case_table_names = 1 # 0=敏感, 1=不敏感(存小寫), 2=存原比較不敏感 # 必須在建表前設定!
utf8mb4BIGINT UNSIGNED AUTO_INCREMENTDECIMAL(18,2)DATETIME (建立) + TIMESTAMP (更新)lower_case_table_names=1 已配置 (跨平台專案)WHERE id > last_id LIMIT 10 替代 LIMIT 100000, 10