C语言连接MySQL中文字符集问题

在学习《Linux程序设计》第8章MySQL数据库8.3节:

使用C语言访问MySQL访问数据库时尝试把SQL数据换成了中文,但是在运行示例程序时终端输出却乱码,MySQL C 语言连接默认字符集是latin1,查了下API找到如下函数可解决中文乱码问题。

1
int mysql_set_character_set(MYSQL *mysql, char *csname)

描述:

该函数用于为当前连接设置默认的字符集。字符串csname指定了1个有效的字符集名称。连接校对成为字符集的默认校对。该函数的工作方式与SET NAMES语句类似,但它还能设置mysql->charset的值,从而影响了由mysql_real_escape_string()设置的字符集。该函数是在MySQL 5.0.7中增加的。返回值0表示成功,非0值表示出现错误。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdlib.h>
#include <stdio.h>

#include "mysql.h"

MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;

void display_row();

int main(int argc, char *argv[])
{
int res;

mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost", "rick",
"secret", "foo", 0, NULL, 0)) {
/* 设置数据库默认字符集 */
if (mysql_set_character_set(&my_connection, "utf8")) {
fprintf(stderr, "错误, %s\n", mysql_error(&my_connection));
}
res = mysql_query(&my_connection,
"SELECT childno, fname, age FROM children WHERE age > 5");
if (res) {
fprintf(stderr, "SELECT error: %s\n",
mysql_error(&my_connection));
} else {
res_ptr = mysql_use_result(&my_connection);
if (res_ptr) {
while ((sqlrow = mysql_fetch_row(res_ptr))) {
display_row();
}
if (mysql_errno(&my_connection)) {
fprintf(stderr, "Retrive error: %s\n",
mysql_error(&my_connection));
}
mysql_free_result(res_ptr);
}
}
mysql_close(&my_connection);
} else {
fprintf(stderr, "Connection failed\n");
if (mysql_errno(&my_connection)) {
fprintf(stderr, "Connection error %d: %s\n",
mysql_errno(&my_connection),
mysql_error(&my_connection));
}
}
return EXIT_SUCCESS;
}

void display_row()
{
unsigned int field_count;

field_count = 0;
while (field_count < mysql_field_count(&my_connection)) {
if (sqlrow[field_count])
printf("%s ", sqlrow[field_count]);
else
printf("NULL");
field_count++;
}
printf("\n");
}
分享到