分类: Mysql/postgreSQL

 

在学习<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  
posted on 2013-03-27 15:03  简单的逻辑  阅读(828)  评论(0)    收藏  举报