前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SQLite】C++链接SQLite读数据乱码问题(非中文)

【SQLite】C++链接SQLite读数据乱码问题(非中文)

作者头像
半生瓜的blog
发布2023-05-13 14:08:39
6080
发布2023-05-13 14:08:39
举报
文章被收录于专栏:半生瓜のblog

前言:

使用C++调用SQLite数据库进行数据读取,调用sqlite3_prepare_v2进行语句合法检查后,使用sqlite3_column_count获取列数,然后调用sqlite3_step进行多次读取,使用sqlite3_column_text获取具体数据。

具体问题:

sqlite3_column_text的返回值为 const unsigned char*,于是我用const unsigned char*存,具体代码如下:

代码语言:javascript
复制
//如果返回SQLITE_ROW则,进行多次执行
for (result = sqlite3_step(m_stmt); result == SQLITE_ROW; 
		result = sqlite3_step(m_stmt)) {
		//获取数据
		

		//将每条数据插入vector
		for (int i = 0; i < count_col; i++) {
			
			m_tmp.push_back(sqlite3_column_text(m_stmt, i));
		}
		
		m_data_array.push_back(m_tmp);
		m_tmp.clear();
		counts++;
}

数据类型

代码语言:javascript
复制
		sqlite3* m_db;
		std::string m_db_path;
		sqlite3_stmt* m_stmt;
		std::vector<std::vector<const unsigned char *> > m_data_array;
		std::vector<const unsigned char *> m_tmp;

查出来的几个字段值先存到m_tmp中,然后在放入m_data_array. 但是我发现,只有在循环内直接访问,才能看到结果,除了这个循环就为乱码。

注意: 我是将SQLite的API又封装了下,这是其中的执行语句模块,上面声明的数据类型,是类中的成员变量。最后通过get_result()获取结果集,然后在其他地方查看数据,于是发现乱码。

get_result()函数声明

代码语言:javascript
复制
std::vector<std::vector<const unsigned char *> > get_result();	//获取结果集

开始我以为是编码问题,于是我搜索,SQLite是UTF-8,C++是ASICC编码,但是出现乱码问题的都是读取中文字符,但是我是数字和字母。不符合该问题。

然后我抱着试一试的心态,将sqlite3_column_text 的返回值(const unsigned char*)强转成char*,然后用string类型的vector来存,并且读取,就成功了。

修改后部分代码如下:

代码语言:javascript
复制
	std::vector<std::vector<std::string> > m_data_array;

	std::vector<std::string> m_tmp;

执行SQL语句模块:

代码语言:javascript
复制
int flight_query::my_sqlite::exec_query(std::string sql) {

	//语句检查——合法
	if (sqlite3_prepare_v2(m_db,sql.c_str(),sql.length(),&m_stmt,NULL) == SQLITE_OK) {

		int result = 0;
		int counts = 0;
		int count_col = sqlite3_column_count(m_stmt);//获取列数
		
		//如果返回SQLITE_ROW则,进行多次执行
		for (result = sqlite3_step(m_stmt); result == SQLITE_ROW; 
			result = sqlite3_step(m_stmt)) {
			//获取数据
			
			std::string tmm;
			//将每条数据插入vector
			for (int i = 0; i < count_col; i++) {
				
				m_tmp.push_back((char*)sqlite3_column_text(m_stmt, i));
			}
			m_data_array.push_back(m_tmp);
			m_tmp.clear();
			counts++;
		}

		if (result == SQLITE_DONE) {
			sqlite3_finalize(m_stmt);//清理语句句柄,准备下一个语句
			return FLIGHT_SUCCESS;
		}else{
			sqlite3_finalize(m_stmt);//清理语句句柄,准备下一个语句
			return SQL_EXEC_FAILED;
		}
	} else {//不合法

		fprintf(stderr,
			"sql exec failed.error code is %d,error reason is %s\n",
			sqlite3_errcode(m_db),
			sqlite3_errmsg(m_db));

		sqlite3_finalize(m_stmt);//清理语句句柄,准备下一个语句
		return SQL_WORDS_ERROR;

	}

}

补充:

除此之外还有个问题,就是本来我是想直接用那个嵌套的vector直接push_back,但是发生段错误。但是我并没有看出哪错了,还请看出来的小伙伴给我留言,谢谢!

代码语言:javascript
复制
m_data_array[counts].push_back((char*)sqlite3_column_text(m_stmt, i));

相关参考:

unsigned char与char 转换

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档