C++ 读取mysql中文乱码,不能写入中文

最近在学习C++ 操作mysql数据库,代码是从网上找的,测试学习,发现数据库有中文读取的时乱码,往数据库写入中文失败

img


#include 
#include "mysql.h"

using namespace std;

int main()
{
    // 1. 初始化连接环境
    MYSQL* mysql = mysql_init(NULL);
    if(mysql == NULL)\
    {
        printf("mysql_init() error\n");
        return -1;

    }

    // 2. 连接数据库服务器
    mysql = mysql_real_connect(mysql, "localhost", "root", "123456", 
                               "test", 0, NULL, 0);
    if(mysql == NULL)
    {
        printf("mysql_real_connect() error\n");
        return -1;
    }

    printf("mysql api使用的默认编码: %s\n", mysql_character_set_name(mysql));

    // 设置编码为utf8
    //mysql_set_character_set(mysql, "utf8");

    printf("mysql api使用的修改之后的编码: %s\n", mysql_character_set_name(mysql));

    printf("恭喜, 连接数据库服务器成功了...\n");

    // 3. 执行一个sql语句
    // 查询scott数据库下的dept部门表
    const char* sql = "select * from building_pcr";
    // 执行这个sql语句
    int ret = mysql_query(mysql, sql);
    if(ret != 0)
    {
        printf("mysql_query() a失败了, 原因: %s\n", mysql_error(mysql));
        return -1;
    }

    // 4. 取出结果集
    MYSQL_RES* res = mysql_store_result(mysql);
    if(res == NULL)
    {
        printf("mysql_store_result() 失败了, 原因: %s\n", mysql_error(mysql));
        return -1;
    }

    // 5. 得到结果集中的列数
    int num = mysql_num_fields(res);

    // 6. 得到所有列的名字, 并且输出
    MYSQL_FIELD * fields = mysql_fetch_fields(res);
    for(int i=0; iprintf("%s\t\t", fields[i].name);
    }
    printf("\n");

    // 7. 遍历结果集中所有的行
    MYSQL_ROW row;
    while( (row = mysql_fetch_row(res)) != NULL)
    {
        // 将当前行中的每一列信息读出
        for(int i=0; iprintf("%s\t\t", row[i]);
        }
        printf("\n");
    }

    // 8. 释放资源 - 结果集
    mysql_free_result(res);

    // 9. 写数据库
    // 以下三条是一个完整的操作, 对应的是一个事务
    // 设置事务为手动提交
    mysql_autocommit(mysql, 0); 
    int ret1 = mysql_query(mysql, "insert into building_pcr values('金', '木')");
    int ret2 = mysql_query(mysql, "insert into building_pcr values('水', '火')");
    int ret3 = mysql_query(mysql, "insert into building_pcr values('土', '金')");
    printf("ret1 = %d, ret2 = %d, ret3 = %d\n", ret1, ret2, ret3);

    if(ret1==0 && ret2==0 && ret3==0)
    {
        // 提交事务
        mysql_commit(mysql);
    }
    else
    {
        mysql_rollback(mysql);
    }

    // 释放数据库资源
    mysql_close(mysql);
    
  return 0;
}


典型的字符集不一致
mysql的my.ini要改,数据库默认字符集要改,表字符集要改,c++文件的存储格式也要改
mysql字符集默认是latin1,c++默认存储的字符集是ANSI
全部改为utf8

设置下mysql的字符集看看

该回答引用GPTᴼᴾᴱᴺᴬᴵ
你的代码中似乎没有设置字符集为utf8,这可能导致中文乱码的问题。你可以尝试在连接数据库之后设置字符集为utf8,像这样:

mysql_set_character_set(mysql, "utf8");


将这行代码添加到你的代码中,重新编译并运行,看看是否能够解决中文乱码的问题。同时,也需要确保你的数据库表的字符集是utf8或utf8mb4,否则即使设置了字符集为utf8,也可能会出现中文乱码的问题。

参考GPT和自己的思路:

你好!对于 C++ 读取 mysql 中文乱码,无法写入中文的问题,可以尝试以下几种方法:

  1. 确认数据库表的字符集是否正确,可以使用以下命令查看:
SHOW FULL COLUMNS FROM table_name;

其中,table_name 为需要确认字符集的表名。

  1. 确认连接数据库时,设置的字符集是否正确。可以通过如下方式设置:
mysql_set_character_set(mysql, "utf8");

其中,mysql 是 MySQL 连接句柄,"utf8" 表示需要设置的字符集。

  1. 确认读取中文时,使用了正确的字符集进行转换。可以使用以下方法进行转换:
string str = mysql_fetch_row(row)[i];
wstring_convert<codecvt_utf8<wchar_t>> conv;
wstring wstr = conv.from_bytes(str);

其中,mysql_fetch_row(row)[i] 表示读取到的字符串,codecvt_utf8 表示 utf8 字符集转为 wchar_t 字符集,conv.from_bytes(str) 表示将 utf8 转为 wchar_t。

以上方法可能需要根据实际情况进行调整,希望能对你解决问题有所帮助!