Chinaunix首页 | 论坛 | 博客
  • 博客访问: 867129
  • 博文数量: 82
  • 博客积分: 2283
  • 博客等级: 大尉
  • 技术积分: 2007
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-15 22:19
文章分类

全部博文(82)

文章存档

2012年(82)

分类: Mysql/postgreSQL

2012-07-30 12:07:41

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

输出结果:

[c-sharp] view plaincopy
  1. [yangjing@yangxunjing:ch08]$ ./select  
  2. 2 羊八井 17  
  3. 3 杨家将 9  
  4. 4 Duncan 6  
  5. 6 Alex 15  
  6. 7 Adrian 9  
阅读(11597) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~