1、MySQL数据库的设置
首先添加Qt程序需要访问MySQL数据库的用户,添加MySQL用户,在MySQL8.0之后,默认的加密方式为:caching_sha2_password,低版本的Navicat连接数据库时间报如下错误提示
高版本连接器无此报错。办理错误的方法,只需要设置密码加密类型为:mysql_native_password,即可。
关于用户密码加密方式的介绍,可以查看这篇文章:深入分析MySQL中的mysql_native_password与ALTER USER命令:提拔数据库安全性的利器_mysql native password-CSDN博客
添加MySQL访问用户:
- -- 创建MySQL用户
- create user 'qtuser'@'%' identified with mysql_native_password by '123456';
- -- 给用户赋予数据库操作权限
- grant all privileges on *.* to 'qtuser'@'%';
- -- 刷新权限
- flush privileges;
复制代码 已有用户设置用户加密类型语句为:
- -- 修改用户的密码加密方式为caching_sha2_password
- alter user 'qtuser'@'%' identified with caching_sha2_password by '123456';
- -- 刷新用户权限
- flush privileges;
复制代码 2、Qt连接并操纵MySQL数据库
要在工程的pro中添加
(1)数据库连接
如果要实现重新连接网络之后自动重连数据库,需要设置db.setConnectOptions("MYSQL_OPT_RECONNECT=1");
- QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
- db.setPort(3306);
- db.setHostName("192.168.10.180");
- db.setUserName("qtuser");
- db.setPassword("123456");
- db.setDatabaseName("world");
- db.setConnectOptions("MYSQL_OPT_RECONNECT=1");//断网重联
- if(db.open())
- {
- qDebug()<<"connect success";
- }
- else {
- qDebug()<<"connect failed!"<<db.lastError().text();
- }
复制代码 (2)插入数据
如果要实现向数据库中插入中文,需要在插入前设置插入字符类型
db.exec("SET NAMES 'UTF8'");
- db.exec("SET NAMES 'UTF8'");//防止插入的中文数据为乱码
- QSqlQuery query(db);
- QString sqlStr = "insert into city(Name,CountryCode,District,Population)values(:Name,:CountryCode,:District,:Population);";
- query.prepare(sqlStr);
- query.bindValue(":Name","洛阳");
- query.bindValue(":CountryCode","AFG");
- query.bindValue(":District","河南");
- query.bindValue(":Population",7079100);
- if(query.exec()){
- qDebug()<<"insert success!";
- }else{
- qDebug()<<"insert failed:"<<query.lastError().text();
- }
复制代码 (3)查询数据
- QVector<CityStruct>rec;
- QSqlQuery query(db);
- query.prepare("select * from city where CountryCode=:CountryCode order by ID desc;");
- query.bindValue(":CountryCode",mCode);
- if(query.exec())
- {
- while (query.next()) {
- CityStruct city;
- city.ID = query.record().value("ID").toInt();
- city.Name = query.record().value("Name").toString();
- city.CountryCode = query.record().value("CountryCode").toString();
- city.District = query.record().value("District").toString();
- city.Population = query.record().value("Population").toInt();
- rec.push_back(city);
- }
- }
- return rec;
复制代码 (4)更新数据
- db.exec("SET NAMES 'UTF8'");
- QSqlQuery query(db);
- query.prepare("update city set Name=:Name where ID=:ID;");
- query.bindValue(":Name","上海");
- query.bindValue(":ID",4084);
- if(query.exec()){
- qDebug()<<"udpate success!";
- }else{
- qDebug()<<"update failed:"<<query.lastError().text();
- }
复制代码 3、可能出现的报错环境
(1)无法加载驱动器
安装的有MySQL,有些环境下运行之后会出现无法加载MySQL驱动器,如下的报错
明显可用的驱动器有QMYSQL,但是照旧提示“QMYSQL driver not loaded”,需要重新下载MySQL连接驱动器,所在:MySQL :: Download MySQL Connector/C (Archived Versions)
解压之后,只需要把libmysql.dll和libmysql.lib拷贝到Qt安装目次中的bin下面即可。
(2)连接失败(SSL connection error)
需要打卡MySQL的设置文件my.ini,在设置文件中加入跳过ssl验证的设置
(3)在命令行中显示的是乱码
在登录的时间设置字符集登录,命令如下:
- mysql --default-character-set=utf8mb4 -u username -p
复制代码 以上不能办理乱码问题,查看数据库的字符集,登录数据库之后,输入命令如下:
如果其中有些参数不是utf8mb4,需要修改MySQL的设置文件
- [client]
- default-character-set=utf8mb4
- [mysql]
- default-character-set=utf8mb4
- [mysqld]
- character-set-server=utf8mb4
- # 用来控制字符集客户端握手的跳过行为。
- # 当这个选项被设置为1时,MySQL服务器在握手阶段将不会尝试使用客户端提供的字符集,而是使用服务器默认的字符集。
- # 这通常用于解决客户端与服务器之间字符集不兼容的问题。
- skip-character-set-client-handshake=1
- collation-server = utf8mb4_unicode_ci
- init_connect='SET NAMES utf8mb4'
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |