在学习<Linux程序设计>第8章MySQL数据库8.3节:
使用C语言访问MySQL访问数据库时尝试把SQL数据换成了中文,但是在运行示例程序时终端输出却乱码,MySQL C 语言连接默认字符集是latin1
查了下API找到如下函数可解决中文乱码问题。
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值表示出现错误。
示例:
#
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"
)
;
}
|
输出结果: