預設編譯的 MySQL 字元集為 latin1,導致中文存取頻繁出現亂碼,開發被迫在應用層做 GBK/UTF-8 雙向轉換,浪費 CPU 且易出錯。本文記錄從原始碼編譯安裝、配置字元集、驗證生效的完整流程(以 Slackware Linux 為例,原理通用)。
removepkg mysql
groupadd mysql
useradd -g mysql -s /bin/bash -d /app/mysql mysql
mkdir -p /app/mysql && chown -R mysql:mysql /app/mysql
cd /app
tar zxvf mysql-VERSION.tar.gz
cd mysql-VERSION
CFLAGS="-O3 -mcpu=pentium3" \
CXX=gcc \
CXXFLAGS="-O3 -mcpu=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
關鍵參數說明:
--with-charset=gbk:預設字元集設為 GBK(支援中文、相容 GB2312)--with-extra-charsets:編譯支援額外字元集,避免執行期動態載入失敗-mcpu:依 CPU 型號優化,提升效能cp support-files/my-medium.cnf /etc/my.cnf
cd /app/mysql
bin/mysql_install_db --user=root
chown -R root .
chown -R mysql var
chgrp -R mysql .
# 啟動時指定字元集
bin/mysqld_safe --user=root --default-character-set=gbk &
# 設定 root 密碼
bin/mysqladmin -u root password 'new-password'
# 連線驗證
bin/mysql -u root --default-character-set=gbk -p
mysql> status;
成功標誌: 輸出中出現:
Server characterset: gbk
Db characterset: gbk
Client characterset: gbk
Conn. characterset: gbk
-- 方式 1:欄位級指定字元集
CREATE TABLE `test`.`cn` (
`zh` CHAR(10) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NOT NULL,
`中文` INT(11) NOT NULL
) ENGINE = MYISAM;
-- 方式 2:建庫時指定預設字元集(推薦,簡潔無特殊痕跡)
CREATE DATABASE dbCN DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
CREATE TABLE `dbCN`.`cn` (
`zh` CHAR(10) NOT NULL,
`中文` INT(11) NOT NULL
) ENGINE = MYISAM;
註:CHARACTER SET 寫 GB2312 或 GBK 均可,GBK 為超集,相容性更好。
mysql> use test;
mysql> insert into cn values("真的?",1);
mysql> select * from cn;
+--------+------+
| zh | 中文 |
+--------+------+
| 真的? | 1 |
+--------+------+
編輯 /etc/rc.d/rc.mysqld(或系統對應的啟動腳本):
# 修改路徑
/app/mysql/bin/mysqld_safe
/app/mysql/var/web.pid
# 追加參數
/app/mysql/bin/mysqld_safe --user=root --default-character-set=gbk &
GBK 為雙位元組編碼,不支援 Emoji、生僻字,且跨系統交互易出現編碼轉換問題。新專案強烈建議全鏈路採用 utf8mb4:
--with-charset=utf8mb4 --with-extra-charsets="utf8mb4 gbk big5"character-set-server = utf8mb4 / collation-server = utf8mb4_unicode_ciSET NAMES utf8mb4 或連線參數 charset=utf8mb4透過原始碼編譯指定預設字元集、初始化時帶入參數、配置檔固化、啟動腳本持久化,可從根本上解決 MySQL 中文支援問題。現代專案請直接採用 utf8mb4 全鏈路,避免 GBK/UTF-8 混用帶來的維護負債。