在开发一个Qt的界面程序,想把程序批量生成的数据文件上传进数据库中。
最开始尝试将文件读到QByteArray类型的变量中,插入数据表的mediumblob类型里,但是插不了,数据表结果一直是NULL空。
尝试数据流QDataStream也不行,程序直接存入少量数据可以,可能是文件太大,数据库放不下。查看配置,将my.ini配置文件中的max_allowed_packet大小改大点,比文件大,原来配置文件里最大只能16M,改成40M,数据表项类型改longblob,结果传入还是NULL。
查看资料有https://blog.csdn.net/qq_45927266/article/details/119297840,用load_file()上传文件,语法
SELECT LOAD_FILE('C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/pic/11.jpg') AS RESULT;
感觉可试,结果是空。
根据该文章查看secure_file_priv
show variables like 'secure_file_priv';
值为NULL,表示禁止文件的导入与导出。值为某一目录,表示只能对该目录下的文件导入与导出。值为空,表示不对文件的读写进行限制。
我的secure_file_priv的值是一个地址,修改my.ini配置文件,在[mysqld]下添加条目secure_file_priv =
仍然为空,看到需要重启mysql,试了重启语句 systemctl restart mysql.service 不好使,又查了几个重启语句都不执行。看到一个说可以在我的电脑右键中的管理的服务里停止mysql,再重启。。。然后我停止mysql服务后,无法重启mysql了。。。
查看资料有https://zhuanlan.zhihu.com/p/357774092,解决过程相当于重新安装了mysql,原来的数据库没有了,但是有mysql啊,所以可以接受,过程如下:
1、在mysql的安装目录里,我的是(C:\Program Files\MySQL\MySQL Server 8.0),bin同级目录下原来没有data文件夹,新创建了一个。
2、以管理员身份打开命令行窗口,我配置了环境变量可以在任意位置,没配置环境变量在bin目录下执行命令
mysqld –initialize
3、安装mysql服务
mysqld --install mysql
4、启动服务
net start mysql
5、登录数据库,此时MySQL初始化后,生成了一个初始随机密码,在data文件夹下后缀为.err的文件。
mysql –u root -p
找到密码,输入密码
可登录成功。
6、重设密码
alter user 'root'@'localhost' identified by 'root';
最后面这root是我设的新密码,设置后刷新权限
flush privileges;
数据库回来后,想起来我的最初目的,是让secure_file_priv值为空,表示不对文件的读写进行限制。原来是一个地址,现在改了配置文件,我又查看了show variables like 'secure_file_priv';
值为NULL,表示禁止文件的导入与导出。
各种尝试也不知道怎么把secure_file_priv值改变,往下试其他方法吧,下面的load data local infile
SHOW GLOBAL VARIABLES LIKE 'local_infile';
我的显示不可用,得改成可用
SET GLOBAL local_infile = true;
再试语句
load data local infile 'D:\11.txt' into table user;
不可行,这个可能是导入数据库文件的,不符合我的需求。
再试我原来的代码,成功了。。。
数据表类型longblob
存入数据类型QByteArray
查看大小,重新安装后看max_allowed_packet大小,反而变的更大了,有60多M,比我在配置文件里写的40M还大。
show global variables like 'max_allowed%';
文件上传到数据库问题解决了,感觉上是重新安装mysql数据库解决的。也可能是接受的大小要再大点。
c++ qt 上传代码
void xx::insertFileData(QString fileName, QString filePath, QString type) { // 获取文件 QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) return; // 将文件转换成二进制数据 QByteArray fileAll = file.readAll(); //保存到数据库中 QSqlQuery queryInsert; queryInsert.prepare("INSERT INTO `xxx-files`(FileName,type,file,creatDate) VALUES(:FileName, :type, :file, :creatDate);"); queryInsert.bindValue(":FileName", fileName); queryInsert.bindValue(":type", type); queryInsert.bindValue(":file", fileAll); queryInsert.bindValue(":creatDate", QDateTime::currentDateTime()); bool res = queryInsert.exec(); if (!res) { qDebug() << queryInsert.lastError().text(); } }
上传到数据库中的文件再读取出来
void xx::downLoadFile() { QSqlQuery query; bool result = query.exec("select * from `xxx-files`;"); QByteArray readData; query.next(); //while (query.next()) //{ // qDebug() << query.value("name").toString(); // qDebug() << query.value("file").toString(); // readData = query.value("file").toByteArray(); //} readData = query.value("file").toByteArray(); qDebug() << query.lastError().text(); QFile writefile("D:\\MAXSim7.1.1\\Data\\TKB\\write.tkb"); if (!writefile.open(QIODevice::WriteOnly)) return; writefile.write(readData); writefile.close(); }
可以读出来,之前用QDataStream类型写文件,写出的文件前有几个乱码,不用QDataStream,直接写速度也很快,且没有乱码。
标签:queryInsert,文件,数据库,file,mysql,上传,priv From: https://www.cnblogs.com/lely/p/16802846.html