首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字符集與儲存引擎修改實戰:解決亂碼與切換 MyISAM

     編輯:MySQL 資料庫相關知識

問題現象:phpMyAdmin 顯示字符集 cp1252 (latin1)

匯入中文資料出現亂碼,因連線字符集與資料實際編碼不符。

解決方案:調整 phpMyAdmin 介面語言

  1. 登入 phpMyAdmin 首頁
  2. 右側 Language (語言) 下拉選單
  3. 將 Chinese simplified-gb2312 改為 Chinese simplified (無 gb2312 後綴)
  4. 左側 MySQL 字符集 即變為 UTF-8 Unicode (utf8)
原理: phpMyAdmin 依介面語言推測連線字符集。選「簡體中文」會發送 SET NAMES gb2312,選「Chinese simplified」則發送 SET NAMES utf8。

永久修正:配置檔設定預設字符集

my.cnf / my.ini

[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

雖然 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)InnoDBRedo/Undo Log、MVCC
高並發寫入InnoDB行級鎖、自適應雜湊索引
唯讀/歸檔分析MyISAM / ColumnStore壓縮率高、全表掃描快
全文搜尋 (MySQL 5.6+)InnoDB原生 Fulltext Index
空間資料 (GIS)InnoDB / MyISAM5.7+ InnoDB 完整支援

驗證修改生效

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
SHOW VARIABLES LIKE 'default_storage_engine';

字符集問題 90% 來自「連線字符集 ≠ 儲存字符集 ≠ 應用字符集」。統一全鏈路使用 utf8mb4 是根治之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved