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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql 8.0 C API连接和获取数据实例(附解决乱码的彩蛋)

假装前言

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

安装Mysql C API

这个有点麻烦,如果Windows平台下的Mysql Installer的话,安装个Mysql Server。相关的头件,库文件在如下 的目录下面。
image.png

实例代码

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

#include <iostream>
#include <assert.h>
#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);
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
60 0
|
14天前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
32 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
5天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
1天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
10 1
|
2天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
|
13天前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
17 0
|
14天前
|
存储 关系型数据库 MySQL
面试官:MySQL一次到底插入多少条数据合适啊?
本文探讨了数据库插入操作的基础知识、批量插入的优势与挑战,以及如何确定合适的插入数据量。通过面试对话的形式,详细解析了单条插入与批量插入的区别,磁盘I/O、内存使用、事务大小和锁策略等关键因素。最后,结合MyBatis框架,提供了实际应用中的批量插入策略和优化建议。希望读者不仅能掌握技术细节,还能理解背后的原理,从而更好地优化数据库性能。
|
14天前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
25 0
|
15天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
50 3
Mysql(4)—数据库索引
|
1天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
10 2