Chinaunix首页 | 论坛 | 博客
  • 博客访问: 400044
  • 博文数量: 14
  • 博客积分: 584
  • 博客等级: 中士
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-26 16:21
文章分类

全部博文(14)

文章存档

2011年(2)

2009年(7)

2008年(5)

我的朋友

分类: Mysql/postgreSQL

2008-12-25 00:00:42

在学习<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");
}

输出结果:

[yangjing@yangxunjing:ch08]$ ./select
2 羊八井 17
3 杨家将 9
4 Duncan 6
6 Alex 15
7 Adrian 9

阅读(3151) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~