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

简介: 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);
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
677 0
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
958 10
|
运维 Prometheus 监控
云原生 API 网关 x OKG:游戏连接治理的「最后一公里」
本文介绍了云原生技术在游戏连接治理中的应用,重点探讨了如何通过 OpenKruiseGame(OKG)与云原生 API 网关的结合,实现游戏服务的优雅下线与无感配置变更。文章分析了游戏服务的强状态特性所带来的挑战,并提出了基于状态感知与连接管理的解决方案,保障玩家会话的连续性与体验的稳定性。同时,还介绍了如何通过零改造接入、全栈可观测性与简化的 API 治理,缩短游戏服务云原生化的“最后一公里”。
630 4
|
Java 分布式数据库 Docker
使用Docker配置并连接HBase的Java API
本流程概要的解释了如何在Docker上配置并启动HBase服务,并通过Java API进行连接和操作表,不涉及具体的业务逻辑处理和数据模型设计,这些因应用而异需由开发者根据实际需求进行实现。
609 13
|
XML JSON API
API接口——连接世界,让你的数据畅通无阻!
API(应用程序编程接口)是连接不同软件系统的桥梁,如同数字世界的“万能适配器”。它通过标准化协议(如RESTful)和数据格式(如JSON/XML),实现前端请求与后端服务的无缝交互。API不仅提升了系统间的协作效率,还通过OAuth 2.0等技术保障安全性,并支持流量管控以优化性能。其应用场景广泛,包括金融科技、物联网、电子商务和社会化平台,为企业带来显著效益,如降低成本、提升响应速度和用户增长。未来,API将向智能化、微服务化、低代码集成和隐私计算方向发展,成为构建数字生态的核心技术,助力万物互联时代的创新与发展。
1913 1
|
搜索推荐 安全 API
聚合电商API:一键连接多平台数据
聚合电商API接口平台整合淘宝、天猫、京东等多平台API,提供一站式数据服务。核心功能包括数据整合、多平台搜索、详细解析与定制化服务,助力商家高效管理订单、优化商品推荐及支持数据驱动决策。平台注重智能化、个性化与全渠道发展,保障数据安全,推动业务增长。
2034 2
|
运维 Prometheus 监控
API 网关 x OKG:游戏连接治理的「最后一公里」
本文介绍了 API 网关与 OpenKruiseGame(OKG)结合,在云原生游戏场景中实现连接治理“最后一公里”的解决方案。针对游戏服务的有状态特性,该方案通过精细化流量管理和无感变更能力,保障玩家会话连续性,提升运维效率,助力游戏服务实现优雅下线、配置动态更新等功能,同时提供零改造接入和全栈可观测性,显著优化游戏体验与开发运维流程。
585 0
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
399 0
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
720 158

推荐镜像

更多