早期 MySQL 默認 latin1,導致中文存儲/讀取亂碼頻發。本文記錄從**源碼編譯指定字符集**到**現代 utf8mb4 全鏈路配置**的演進實踐,助你一次性搞定中文、Emoji、生僻字。
# 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 → 成功
[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
-- 新建庫
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;
jdbc:mysql://host:3306/db?characterEncoding=utf8&useUnicode=true&connectionCollation=utf8mb4_0900_ai_cicharset='utf8mb4'charset=utf8mb4 in DSNcharset=utf8mb4,utf8 in DSNSHOW VARIABLES LIKE 'character_set%'; → 除 filesystem 外全 utf8mb4。SHOW VARIABLES LIKE 'collation%'; → 全 utf8mb4_0900_ai_ci。INSERT INTO t VALUES ('中文😀𠮷'); SELECT * FROM t; 正常顯示、長度正確(CHAR_LENGTH=4)。utf8 實為 utf8mb3,**不支持 4 字節字符**(Emoji、生僻字),**必須用 utf8mb4**。mysqldump --default-character-set=utf8mb4 ... 避免導出時隱式轉碼。從源碼編譯指定 gbk 到開箱即用 utf8mb4,MySQL 中文支持已歷經十餘年演進。**統一全鏈路 utf8mb4,拒絕任何隱式轉碼**,是徹底解決亂碼的唯一正道。