QT使用MySQL写入中文乱码的问题

本文介绍在Qt中连接MySQL遇到的中文乱码问题及解决方案。通过使用占位符和QString处理,避免了直接字符串拼接导致的乱码,确保数据正确写入。

最近在学习qt连接MySQL的过程中出现了一个中文乱码的问题,就是在使用QSqlQuery query;query.exec(“insert into student values(1,‘中文’)”);这样使用写入MySQL的时候回出现中文乱码,读出的时候因为写入的时候就是乱码,所以读出也是乱码,但是如果直接在MySQL或者Navicat上添加的话是正常的,在qt中进行读出也是正常的,qt默认情况是utf8的编码,而MySQL一般情况下建立数据量连接时没有特别去做修改的话一般默认也是utf8的编码,这样基本上就可以确定是写入的问题和其他的地方没有太大的关系,所以我就是采用了占位符的方式进行了数据的添加,也就是query.exec(QString(“insert into student values(1,’%1’)”).arg(i));这里QString i = QString::fromLocal8Bit("中文’);当这样写入的时候就不会出现中文乱码了。
我这里就给大家提供一种MySQL连接qt的中文乱码的解决思路吧,虽然比较笨拙了一些,对性能可能有一些影响,如果大家有其他好的方法的可以在下方留言,我也洗耳恭听,多多学习,大家一起成长!

   说的不好,请大家多多指点。
<think> 嗯,用户的问题是在Qt使用MySQL数据库写入数据的方法。之前提供的引用内容很丰富,但我需要从中提取关键信息来构建一个清晰的回答流程。 用户特别强调了不使用QtSQL模块的方案,引用[1]提到了使用MySQL C API的方法。不过引用[3]和[5]展示了QtSQL的标准用法,这个其实更主流。考虑到用户可能只是不想用QtSQL驱动层(比如遇到QMYSQL driver not loaded的问题),实际应用还是推荐标准方案。 从引用内容看,关键步骤是: 1. 环境配置(引用[2][4]提到的dll部署问题) 2. 连接数据库(引用[3]的db.open()示例) 3. 执行SQL写入(引用[5]的字符集注意事项) 用户可能是遇到驱动配置问题才想绕开QtSQL,但直接使用C API会更复杂。我应该先给出标准方案,再补充替代方案。标准方案的重点在于: - 驱动文件配置(qsqlmysql.dll的位置) - UTF-8字符集处理(引用[5]的SET NAMES) - 事务控制(QSqlQuery配合事务) 对于替代方案,引用[1]提到的MySQL C API需要详细说明: - mysql_real_connect的用法 - mysql_query执行INSERT - 需要手动处理字符串编码转换 安全方面要提醒预处理语句防SQL注入,这个在两种方案都要强调。性能方面事务批处理可以提升写入速度,特别是大量数据时。 用户可能卡在驱动配置这一步,所以要把引用[2][4]的路径问题说透,比如Debug/Release版本dll的区别。示例代码需要完整可运行,从包含头文件到错误处理都要覆盖。 </think> 在Qt使用MySQL数据库写入数据,主要有两种方法:**标准QtSQL模块方案**和**MySQL C API替代方案**。以下是详细步骤和示例代码: --- ### 方案一:标准QtSQL模块(推荐) #### 步骤: 1. **环境配置** - 将MySQL驱动文件 `qsqlmysql.dll` 复制到 `Qt安装目录/plugins/sqldrivers`(引用[2][4]) - 确保MySQL Server字符集为 `utf8mb4`(引用[5]) 2. **代码实现** ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QDebug> bool writeToMySQL() { // 1. 创建数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("127.0.0.1"); db.setPort(3306); db.setUserName("root"); db.setPassword(""); db.setDatabaseName("test"); // 数据库名 // 2. 打开连接 if (!db.open()) { qDebug() << "连接失败:" << db.lastError().text(); return false; } // 3. 设置字符集(关键!) QSqlQuery charsetQuery; charsetQuery.exec("SET NAMES 'utf8mb4'"); // 防止中文乱码(引用[5]) // 4. 写入数据 QSqlQuery query; query.prepare("INSERT INTO users (name, age) VALUES (?, ?)"); query.addBindValue("张三"); // 自动处理UTF-8转换 query.addBindValue(25); if (!query.exec()) { qDebug() << "写入失败:" << query.lastError().text(); return false; } qDebug() << "写入成功!"; db.close(); return true; } ``` #### 关键点: - 驱动配置:必须放置正确的 `qsqlmysql.dll`(引用[2][4]) - 字符集:连接后立即执行 `SET NAMES 'utf8mb4'`(引用[5]) - 参数绑定:使用 `prepare()` + `addBindValue()` 防止SQL注入 --- ### 方案二:MySQL C API(无QtSQL依赖) #### 步骤: 1. **安装依赖** - 下载 [MySQL Connector/C](https://dev.mysql.com/downloads/connector/c/) - Qt项目 `.pro` 添加: ```qmake INCLUDEPATH += "C:/mysql-connector-c/include" LIBS += -L"C:/mysql-connector-c/lib" -llibmysql ``` 2. **代码示例** ```cpp #include <mysql.h> #include <QDebug> bool writeWithCAPI() { MYSQL *conn = mysql_init(nullptr); // 1. 连接数据库 if (!mysql_real_connect(conn, "127.0.0.1", "root", "", "test", 3306, nullptr, 0)) { qDebug() << "连接失败:" << mysql_error(conn); return false; } // 2. 设置字符集(重要!) mysql_set_character_set(conn, "utf8mb4"); // 3. 执行INSERT const char *sql = "INSERT INTO users (name, age) VALUES ('李四', 28)"; if (mysql_query(conn, sql)) { qDebug() << "写入失败:" << mysql_error(conn); mysql_close(conn); return false; } qDebug() << "写入成功!"; mysql_close(conn); return true; } ``` #### 注意事项: - **字符处理**:MySQL C API使用Latin1编码,需手动转换中文字符: ```cpp QString name = "王五"; QByteArray utf8Name = name.toUtf8(); QString sql = QString("INSERT INTO users (name) VALUES ('%1')").arg(utf8Name.constData()); ``` - **防注入**:需自行实现参数过滤(推荐 `mysql_real_escape_string()`) --- ### 常见问题解决 1. **驱动加载失败(QMYSQL driver not loaded)** - 检查 `qsqlmysql.dll` 是否在正确路径(引用[2]) - 确认Qt版本与MySQL架构匹配(32/64位) 2. **中文乱码** - 确保四步统一(引用[5]): ```sql SET NAMES 'utf8mb4'; -- Qt连接后立即执行 CREATE DATABASE ... CHARSET=utf8mb4; CREATE TABLE ... CHARSET=utf8mb4; ``` 3. **连接超时** - 检查MySQL用户远程权限: ```sql GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '密码'; FLUSH PRIVILEGES; ``` --- ### 性能优化建议 1. **事务批处理**(提速10倍以上): ```cpp db.transaction(); // 开始事务 for (int i = 0; i < 1000; ++i) { query.exec("INSERT ..."); } db.commit(); // 提交事务 ``` 2. **预处理语句复用**: ```cpp query.prepare("INSERT ... VALUES (?,?)"); for (auto &data : dataset) { query.addBindValue(data.name); query.addBindValue(data.age); query.exec(); } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值