首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C語言操作 MySQL 存入中文亂碼怎麼辦?完整解決方案

     編輯:程式設計疑難解答

在使用 C 語言操作 MySQL 資料庫時,中文亂碼是開發者常遇到的棘手問題。這通常是因為客戶端、連接、資料庫、資料表或欄位的字元集編碼不一致導致的。本文將系統性地分析亂碼成因,並提供完整的解決步驟與程式碼範例。

核心成因分析

MySQL 亂碼本質上是「編碼不匹配」。資料在 C 程式(通常為 UTF-8 或 GBK)→ MySQL 客戶端庫 → 網路傳輸 → MySQL Server → 存儲引擎 的流程中,若任一環節編碼聲明與實際不符,就會產生亂碼。常見情況包括:

  • 程式碼檔案編碼為 UTF-8,但連接未設定字元集,MySQL 預設用 latin1 接收
  • 資料庫/資料表建立時未指定 CHARSET=utf8mb4
  • 連接字串缺少 characterEncoding=utf8 或 set names utf8mb4

完整解決步驟

1. 確保資料庫與資料表使用 utf8mb4

CREATE 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;

2. 連接建立後立即執行 SET NAMES

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");

3. 原始碼檔案存儲為 UTF-8 無 BOM

在 Visual Studio、VS Code、CLion 等 IDE 中,將 .c/.cpp 檔案編碼統一設為「UTF-8」,避免原始碼字面常量被編譯器誤解析。

4. 插入/查詢時使用參數化或轉義

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」:源碼、連接、資料庫、資料表、欄位五個層面全部統一。

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