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

MySQL 徹底解決中文亂碼:從源碼編譯到 utf8mb4 全鏈路實戰

     編輯:MySQL 資料庫相關知識

早期 MySQL 默認 latin1,導致中文存儲/讀取亂碼頻發。本文記錄從**源碼編譯指定字符集**到**現代 utf8mb4 全鏈路配置**的演進實踐,助你一次性搞定中文、Emoji、生僻字。

歷史方案:源碼編譯指定 charset(MySQL 4.x/5.0 時代)

# 1. 卸載系統自帶 MySQL
removepkg mysql

# 2. 建立用戶/目錄
groupadd mysql
useradd -g mysql -s /bin/bash -d /app/mysql mysql
mkdir -p /app/mysql && chown -R mysql.mysql /app/mysql

# 3. 下載源碼並編譯安裝
tar zxvf mysql-VERSION.tar.gz
cd mysql-VERSION
CFLAGS="-O3 -mtune=pentium3" CXX=gcc CXXFLAGS="-O3 -mtune=pentium3 -felide-constructors" \
./configure --prefix=/app/mysql \
            --with-charset=gbk \
            --with-extra-charsets="gbk gb2312 big5 utf8" \
            --with-unix-socket-path=/etc/mysql.sock \
            --enable-local-infile --enable-thread-safe-client \
            --enable-assembler --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
make && make install

# 4. 初始化、啟動、設置密碼
cp support-files/my-medium.cnf /etc/my.cnf
/app/mysql/bin/mysql_install_db --user=mysql
chown -R root /app/mysql && chown -R mysql /app/mysql/var
/app/mysql/bin/mysqld_safe --user=mysql --default-character-set=gbk &
/app/mysql/bin/mysqladmin -u root password 'new-password'

# 5. 驗證
/app/mysql/bin/mysql -u root --default-character-set=gbk -p
mysql> STATUS;
# Server/Db/Client/Conn. characterset 均為 gbk → 成功

現代最佳實踐:utf8mb4 全鏈路(MySQL 5.5+ / 8.0 推薦)

1. 服務端配置 (/etc/my.cnf)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
# init_connect='SET NAMES utf8mb4'  # 非超級用戶自動執行

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

2. 數據庫/表/列級顯式指定

-- 新建庫
CREATE DATABASE db_cn DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

-- 新建表(無需逐列指定,繼承庫默認)
CREATE TABLE db_cn.cn (
    zh VARCHAR(100) NOT NULL,
    `中文` INT NOT NULL
) ENGINE=InnoDB;

-- 存量表轉換
ALTER TABLE old_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

3. 連接層統一

  • JDBC:jdbc:mysql://host:3306/db?characterEncoding=utf8&useUnicode=true&connectionCollation=utf8mb4_0900_ai_ci
  • Python (PyMySQL/mysqlclient):charset='utf8mb4'
  • PHP (PDO):charset=utf8mb4 in DSN
  • Go (go-sql-driver/mysql):charset=utf8mb4,utf8 in DSN

4. 應用層文件編碼

  • 所有源碼、配置、模板文件保存為 **UTF-8 無 BOM**。
  • HTML 頁面 ``。
  • HTTP 響應頭 `Content-Type: text/html; charset=UTF-8`。

驗證清單

  1. SHOW VARIABLES LIKE 'character_set%'; → 除 filesystem 外全 utf8mb4。
  2. SHOW VARIABLES LIKE 'collation%'; → 全 utf8mb4_0900_ai_ci。
  3. 寫入測試:INSERT INTO t VALUES ('中文😀𠮷'); SELECT * FROM t; 正常顯示、長度正確(CHAR_LENGTH=4)。
  4. 排序/分組/模糊查詢無誤判。

避坑指南

  • utf8 ≠ utf8mb4:MySQL utf8 實為 utf8mb3,**不支持 4 字節字符**(Emoji、生僻字),**必須用 utf8mb4**。
  • 連接池缓存舊連接:修改配置後需重啟應用/連接池,或設置連接初始化 SQL。
  • mysqldump 導出/導入:mysqldump --default-character-set=utf8mb4 ... 避免導出時隱式轉碼。

從源碼編譯指定 gbk 到開箱即用 utf8mb4,MySQL 中文支持已歷經十餘年演進。**統一全鏈路 utf8mb4,拒絕任何隱式轉碼**,是徹底解決亂碼的唯一正道。

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