在使用 C 語言操作 MySQL 資料庫時,中文亂碼是開發者常遇到的棘手問題。這通常是因為客戶端、連接、資料庫、資料表或欄位的字元集編碼不一致導致的。本文將系統性地分析亂碼成因,並提供完整的解決步驟與程式碼範例。
MySQL 亂碼本質上是「編碼不匹配」。資料在 C 程式(通常為 UTF-8 或 GBK)→ MySQL 客戶端庫 → 網路傳輸 → MySQL Server → 存儲引擎 的流程中,若任一環節編碼聲明與實際不符,就會產生亂碼。常見情況包括:
characterEncoding=utf8 或 set names utf8mb4CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
MYSQL *conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "user", "pass", "mydb", 3306, NULL, 0);
mysql_set_character_set(conn, "utf8mb4"); // 關鍵:設定連接字元集
// 或執行 SQL:mysql_query(conn, "SET NAMES utf8mb4");
在 Visual Studio、VS Code、CLion 等 IDE 中,將 .c/.cpp 檔案編碼統一設為「UTF-8」,避免原始碼字面常量被編譯器誤解析。
char query[512];
char *name = "測試中文";
unsigned long len = strlen(name);
char *escaped = malloc(len * 2 + 1);
mysql_real_escape_string(conn, escaped, name, len);
sprintf(query, "INSERT INTO users(name) VALUES ('%s')", escaped);
mysql_query(conn, query);
free(escaped);
| 檢查項目 | 正確做法 |
|---|---|
| my.cnf / my.ini | [mysqld] character-set-server=utf8mb4 |
| 客戶端庫版本 | 建議使用 MySQL Connector/C 6.1+,完整支援 utf8mb4 |
| 終端/控制台編碼 | Windows 下 chcp 65001 或 IDE 輸出視窗設為 UTF-8 |
編譯執行下列最小程式,若終端顯示「插入成功:測試中文」,即代表全鏈路編碼正確:
#include
#include
#include
#include
int main() {
MYSQL *conn = mysql_init(NULL);
if (!mysql_real_connect(conn, "127.0.0.1", "root", "123456", "testdb", 3306, NULL, 0)) {
fprintf(stderr, "連接失敗: %s\n", mysql_error(conn)); return 1;
}
mysql_set_character_set(conn, "utf8mb4");
const char *name = "測試中文";
char sql[256], *esc = malloc(strlen(name)*2+1);
mysql_real_escape_string(conn, esc, name, strlen(name));
sprintf(sql, "INSERT INTO t(name) VALUES ('%s')", esc);
if (mysql_query(conn, sql)) fprintf(stderr, "錯誤: %s\n", mysql_error(conn));
else printf("插入成功:%s\n", name);
free(esc); mysql_close(conn); return 0;
}
按照上述步驟逐項排查,99% 的 C 語言 MySQL 中文亂碼問題都能徹底解決。關鍵在於「全鏈路 utf8mb4」:源碼、連接、資料庫、資料表、欄位五個層面全部統一。