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

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

前言:

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

具体问题:

sqlite3_column_text的返回值为 const unsigned char,于是我用const unsigned char存,具体代码如下:
//如果返回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++;
}

数据类型

        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()函数声明

std::vector<std::vector<const unsigned char *> > get_result();    //获取结果集
开始我以为是编码问题,于是我搜索,SQLite是UTF-8,C++是ASICC编码,但是出现乱码问题的都是读取中文字符,但是我是数字和字母。不符合该问题。

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

修改后部分代码如下:

    std::vector<std::vector<std::string> > m_data_array;

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

执行SQL语句模块:

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,但是发生段错误。但是我并没有看出哪错了,还请看出来的小伙伴给我留言,谢谢!
m_data_array[counts].push_back((char*)sqlite3_column_text(m_stmt, i));

相关参考:

unsigned char与char 转换
相关文章
|
7月前
|
缓存 编译器 API
【C/ C++链接】深入C/C++链接:从基础到高级应用(二)
【C/ C++链接】深入C/C++链接:从基础到高级应用
83 1
|
7月前
|
编译器 开发工具 C++
Dev-C++详细安装教程及中文设置(附带安装包链接)
Dev-C++详细安装教程及中文设置(附带安装包链接)
3100 0
|
7月前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
300 0
|
7月前
|
编译器 C++ 开发者
【C/ C++链接】深入C/C++链接:从基础到高级应用(一)
【C/ C++链接】深入C/C++链接:从基础到高级应用
128 0
|
7月前
|
关系型数据库 数据库 C++
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
【C++】Windows使用Visual Studio C++链接云数据库PostgreSQL(沉浸式老爷教学)
|
3月前
|
C++
C/C++静态链接pthread库的坑【-static -pthread】
C/C++静态链接pthread库的坑【-static -pthread】
|
6月前
|
Linux vr&ar C语言
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
367 2
|
7月前
|
编译器 程序员 API
【踩坑记录】解决GCC 中C++ 17 的 std::filesystem 链接报错:undefined reference to `std::filesystem::path
【踩坑记录】解决GCC 中C++ 17 的 std::filesystem 链接报错:undefined reference to `std::filesystem::path
2011 4
|
7月前
|
存储 算法 安全
【C/C++ 模板编程 链接问题】 了解和解决模板编程中的链接错误以及正确的模板编写方式
【C/C++ 模板编程 链接问题】 了解和解决模板编程中的链接错误以及正确的模板编写方式
179 1
|
7月前
|
算法 Unix Linux
【C/C++ 疑难解决】深入解析C++链接错误:实用的调试技巧和方法
【C/C++ 疑难解决】深入解析C++链接错误:实用的调试技巧和方法
642 1