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

MySQL 字元集實戰指南:UTF-8 最佳實踐、GB2312 避坑與舊資料遷移轉碼

     編輯:MySQL 資料庫相關知識

核心建議:統一使用 UTF-8 (utf8mb4)

  • 資料庫/表/欄位/連線/頁面/應用程式 **全鏈路 UTF-8**,避免轉碼錯誤與亂碼。
  • utf8mb4 (MySQL 5.5.3+) 支援完整 Unicode (含 Emoji、補充字元),**舊 utf8 僅支援 BMP (3 位元組)**,新專案**強制 utf8mb4**。
  • 排序規則推薦 utf8mb4_general_ci (速度快) 或 utf8mb4_unicode_ci (準確)。

完整建立範例

-- 1. 建庫指定預設字元集
CREATE DATABASE IF NOT EXISTS my_db
  DEFAULT CHARACTER SET utf8mb4
  COLLATE utf8mb4_general_ci;

-- 2. 建表指定 (可省略,繼承資料庫預設)
CREATE TABLE my_table (
    name VARCHAR(20) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

應用程式連線設定 (關鍵步驟)

語言/框架設定方式
PHP (mysqli/PDO)mysqli_set_charset($link, 'utf8mb4'); 或 PDO DSN charset=utf8mb4
Java (JDBC)URL jdbc:mysql://host/db?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8mb4_general_ci
Python (PyMySQL)charset='utf8mb4' 參數
.NET (Connector/NET)ConnectionString CharSet=utf8mb4

**必須在建立連線後、執行任何 SQL 前設定**,否則該連線會用 Server 預設字元集 (通常 latin1) 收發資料 → 亂碼根源。

頁面/前端設定

<meta charset="utf-8">

Content-Type: text/html; charset=utf-8

舊資料遷移:latin1/GBK → utf8mb4

  1. 導出舊資料 (指定舊字元集)
    mysqldump --default-character-set=latin1 -h localhost -u root -p db_name --tables old_table > old.sql
  2. 轉碼 (Linux/Unix)
    iconv -f gb2312 -t utf-8 -c old.sql > new.sql
    或自動偵測來源:iconv -t utf-8 -c old.sql > new.sql
  3. 修改 SQL 檔:在 INSERT 前加入
    SET NAMES utf8mb4;
  4. 導入
    mysql --default-character-set=utf8mb4 -h localhost -u root -p db_name < new.sql

若堅持使用 GB2312/GBK (不推薦)

  • 表字元集設為 latin1 (二進位透傳),**不要用 gb2312/gbk**,MySQL 對多位元組字元集的排序/比較支援有限。
  • 欄位加 BINARY 屬性強制二進位比較:
    name VARCHAR(20) BINARY NOT NULL DEFAULT ''
  • 缺點:無法正確排序、LIKE 模糊查詢失效、跨系統交換極易出錯。

支援 UTF-8 顯示的 GUI 工具

  • Navicat (付費、官方中文化、支援 utf8mb4 完美顯示)
  • DBeaver (開源、跨平台、支援 utf8mb4)
  • MySQL Workbench (官方、支援 utf8mb4)
  • 舊工具 MySQL-Front 已停止更新,不建議使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved