匯入中文資料出現亂碼,因連線字符集與資料實際編碼不符。
Chinese simplified-gb2312 改為 Chinese simplified (無 gb2312 後綴)UTF-8 Unicode (utf8)SET NAMES gb2312,選「Chinese simplified」則發送 SET NAMES utf8。
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4'
utf8mb4 vs utf8: utf8mb4 支援完整 Unicode (含 Emoji),utf8 僅支援 BMP 平面 (3 字節)。新專案一律用 utf8mb4。
雖然 InnoDB 為預設 (支援事務、外鍵、行鎖),但特定場景 (唯讀、全文搜尋舊版、空間限制) 仍需 MyISAM。
[mysqld] default-storage-engine = MYISAM
重啟服務生效:systemctl restart mysqld
CREATE TABLE logs ( id INT AUTO_INCREMENT PRIMARY KEY, msg TEXT ) ENGINE=MYISAM; -- 僅此表用 MyISAM
ALTER TABLE old_table ENGINE = MYISAM; -- 注意:大表轉換會鎖表,建議用 pt-online-schema-change 或影子表 RENAME
| 需求 | 推薦引擎 | 理由 |
|---|---|---|
| 事務支援 (ACID) | InnoDB | Redo/Undo Log、MVCC |
| 高並發寫入 | InnoDB | 行級鎖、自適應雜湊索引 |
| 唯讀/歸檔分析 | MyISAM / ColumnStore | 壓縮率高、全表掃描快 |
| 全文搜尋 (MySQL 5.6+) | InnoDB | 原生 Fulltext Index |
| 空間資料 (GIS) | InnoDB / MyISAM | 5.7+ InnoDB 完整支援 |
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; SHOW VARIABLES LIKE 'default_storage_engine';
字符集問題 90% 來自「連線字符集 ≠ 儲存字符集 ≠ 應用字符集」。統一全鏈路使用 utf8mb4 是根治之道。