使用 MySQL C API (libmysql) 讀寫中文,核心在於連接建立後、每次 SQL 執行前顯式調用 mysql_set_character_set(conn, "gb2312")(或 gbk),確保客戶端、連接層、結果集三層編碼一致。
#include
#include
#include
#include
#pragma comment(lib, "libmysql.lib")
MYSQL *mysql;
MYSQL_RES *res;
MYSQL_ROW row;
int main() {
mysql = mysql_init(NULL);
mysql_real_connect(mysql, "localhost", "root", "pwd", "db", 3306, NULL, 0);
mysql_set_character_set(mysql, "gb2312"); // 關鍵行
// 建表指定 CHARSET=gb2312
mysql_query(mysql, "CREATE TABLE t(s0 VARCHAR(100), s1 CHAR(6), s2 VARCHAR(4), s3 VARCHAR(3), s4 INT) ENGINE=InnoDB DEFAULT CHARSET=gb2312");
// 插入中文
mysql_query(mysql, "INSERT INTO t VALUES('2000-3-10 21:01:30','Test','清風寒劍','歲月情',2500)");
// 查詢並打印
mysql_query(mysql, "SELECT * FROM t");
res = mysql_store_result(mysql);
while ((row = mysql_fetch_row(res))) {
for (int i=0; i
mysql_set_character_set(mysql, "gb2312") 等同於執行 SET NAMES gb2312。DEFAULT CHARSET=gb2312,避免服務端默認 latin1 導致存入時二次轉碼錯誤。mysql_query 前調用一次,防止會話變量被他人修改。libmysql 對 utf8 支持不完善,實測 gb2312/gbk 通過、utf8 失敗;現代項目請升級驅動並統一 utf8mb4。#pragma comment(lib,"libmysql.lib") 或 -lmysqlclient,確保頭文件與庫版本匹配。控制台正確顯示「清風寒劍」「歲月情」,證明中文存取全鏈路暢通。