Mysql 8.0 C API连接和获取数据实例(附解决乱码的彩蛋)

这里写目录标题

  • 假装前言
  • 安装Mysql C API
  • 实例代码
  • 文末彩蛋,解决prinf打印乱码的问题

假装前言

使用Mysql的C API,编写一个连接Mysql数据库实例的代码。

安装Mysql C API

这个有点麻烦,如果Windows平台下的Mysql Installer的话,安装个Mysql Server。相关的头件,库文件在如下 的目录下面。
Mysql 8.0 C API连接和获取数据实例(附解决乱码的彩蛋)_第1张图片

实例代码

人好话不多,直接上代码。

#include 
#include 
#include "mysql.h"
#pragma comment(lib, "libmysql.lib")

int main(int argc, char* argv[])
{
    MYSQL *pMysql = mysql_init(NULL);
    if ( NULL == pMysql )
    {
        printf("%s: %d : error : %s\n",__FILE__,  __LINE__, mysql_error(pMysql));
        exit(1);
    }
    if ( NULL == mysql_real_connect(pMysql, "x.x.x.x", "user", "password", "database", 3306, NULL, 0) )
    {
        printf("%s: %d : error : %s\n", __FILE__, __LINE__, mysql_error(pMysql));
        exit(1);
    }
    if ( NULL != mysql_set_character_set(pMysql, "utf8") )
    {
        printf("%s: %d : error : %s\n", __FILE__, __LINE__, mysql_error(pMysql));
        exit(1);
    }
    if ( NULL != mysql_real_query(pMysql, "select * from sys_user", strlen("select * from sys_user")) )
    {
        printf("%s: %d : error : %s\n", __FILE__, __LINE__, mysql_error(pMysql));
        exit(1);
    }
    MYSQL_RES* res = mysql_store_result(pMysql);
    if (NULL == res )
    {
        printf("%s : %d : error : %s\n", __FILE__, __LINE__, mysql_error(pMysql));
        exit(1);
    }

    // Handling result set retrieved from database table.
 
    // Retrieve meta data information.
    MYSQL_FIELD* myfields;
    while (myfields = mysql_fetch_field(res))
    {
        printf("%s", myfields->name);
        printf(" | ");
    }
    printf("\n"); 
    printf("--------------------------------------------------------------------------------------------------------\n");

    // Retrieve cell value of each row.
    int cols = 0;
    cols = mysql_num_fields(res);
    MYSQL_ROW row;
    while ( row = mysql_fetch_row(res) )
    {
        for ( int i = 0; i < cols; i++ )
        {
            if (row[i] != NULL)
            {
                // To display correctly. use chcp 65001.
                SetConsoleOutputCP(65001);
                size_t nSize = strlen(row[i]);
                char*pC = (char*)malloc(sizeof(char) * nSize + 2);
                assert(pC != NULL);
                memset(pC, 0, nSize+2);
                strncpy_s(pC, nSize+2, row[i], 5120);
                printf("%s", row[i]);
            }
            else
            {
                printf("NULL");
            }

            printf("|");
        }
        printf("\n");
    }

    mysql_free_result(res);
    mysql_close(pMysql);
}

文末彩蛋,解决prinf打印乱码的问题

开始调试和运行后,发现中文字符内容在console中,打印出来的一直是乱码,即使设置了mysql_set_character_set(pMysql, "utf8")。定位后发现,Mysql C API在获取结果时,通过printf打印乱码的原因是,用于输出的console控制台的code page不一致导致无法正确显示UTF8编码的内容。按以下方式(仅在windows平台),设置console的code page代码页,即可正常显示中文字符。

// To display correctly. use chcp 65001.
SetConsoleOutputCP(65001);

Code Pages On Microsoft Learn: link

你可能感兴趣的:(C/C++,数据库技术,开发语言,Mysql,C/C++)