使用QT连接MySql的那些坑

首先是QT连接mysql数据库时出现driver not loaded的解决办法

废话不多说,直接上图
使用QT连接MySql的那些坑_第1张图片

使用QT连接MySql的那些坑_第2张图片

好了,环境整明白了,之前看很多帖子说是mysql和QT的位数不一致就会报错,我没有遇到这个问题,这里都是都是64bit,无所谓了,遇到再说。下面开始做驱动的编译工作,首先,进到这个目录
C:\Qt\5.12.8\Src\qtbase\src\plugins\sqldrivers\mysql 双击mysql.pro,使用QT打开它
使用QT连接MySql的那些坑_第3张图片
然后对mysql.pro做以下修改,这里如果需要做两处修改,就是代码块中绿色的部分,前面的QMAKE注释掉,后面添加依赖的库文件和头文件的路径,这些文件在你的mysql的安装目录里。这里一定要注意路径的格式,不然会报很多错误,我抄过一些网上的写法,构建的时候有时候报Permission denied,有时候报未引用,后悔makefile文件的写法没好好学,底子太差了,浪费了我一个下午的时间

TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)

INCLUDEPATH += "C:/Program Files/MySQL/MySQL Server 8.0/include"
DEPENDPATH += "C:/Program Files/MySQL/MySQL Server 8.0/include"
LIBS += "C:/Program Files/MySQL/MySQL Server 8.0/lib/libmysql.lib"

mysql的安装目录如下
使用QT连接MySql的那些坑_第4张图片

修改后如图所示
使用QT连接MySql的那些坑_第5张图片
在修改完成后会报找不到qtsqldrivers-config.pri这个文件的情况,我找了以下,也确实没有这个文件,有的是configure.pri和qsqldriverbase.pri这两个文件,所以要对引用qtsqldrivers-config.pri的文件qsqldriverbase.pri做一点修改
使用QT连接MySql的那些坑_第6张图片

QT  = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(./configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII

使用QT连接MySql的那些坑_第7张图片
至此,需要写代码的部分已经大功告成,接下来,点击构建(小锤子),就可在以下目录找到对应的库文件
使用QT连接MySql的那些坑_第8张图片使用QT连接MySql的那些坑_第9张图片
生成的库文件放在C:\Qt\5.12.8\mingw73_64\plugins\sqldrivers目录下
使用QT连接MySql的那些坑_第10张图片
到这里,驱动就准备好了,在使用QT连接mysql时只需要把libmysql.dll,libeay32.dll,ssleay32.dll放在生成的.Exe程序的同级目录下,就可以正常使用,避免driver not loaded的错误。这里要说明的是,libmysql.dll是生成驱动时对应的文件。
使用QT连接MySql的那些坑_第11张图片使用QT连接MySql的那些坑_第12张图片
以上是在64位Qt编译64位MySql驱动的情况,关于在32位Qt编译64位MySql驱动的情况,有一些细微的区别,首先,我们需要connector/c 6.1.11 x86,打开installer
使用QT连接MySql的那些坑_第13张图片
然后因为我的系统是64位的,这里无法安装connector/c 6.1.11 x86,然后目光转向MySql官网,放上链接https://downloads.mysql.com/archives/c-c/,界面如下
使用QT连接MySql的那些坑_第14张图片下载好connector/c 6.1.11 x86好以后,解压后放在桌面上,然后修改mysql.pro文件,代码如下

TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql

OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin

include(../qsqldriverbase.pri)

INCLUDEPATH += "C:/Users/yuanx/Desktop/mysql-connector-c-6.1.11-win32/include"
DEPENDPATH += "C:/Users/yuanx/Desktop/mysql-connector-c-6.1.11-win32/include"
LIBS += "C:/Users/yuanx/Desktop/mysql-connector-c-6.1.11-win32/lib/libmysql.lib"

点击构建,就可以生成对应的32位驱动,生成的库文件放在C:\Qt\5.12.8\mingw73_32\plugins\sqldrivers目录下。

到了这里,按理说是没有什么问题的,然而我还是太天真了,在连接MySql时,倒是不会报driver not loaded的错误了,却会报连接失败的问题,可怜的我还以为驱动的问题没有解决,又是多半天的时间,百思不得其解,直到后来,才发现是mysql更改了加密方式,MYSQL8.0之前的版本中加密规则是mysql_native_password,而在MYSQL8.0之后,加密规则是caching_sha2_password。接着,更改它的加密方式,

use mysql;
alter user 'root'@'localhost' identified with mysql_native_password by '密码';

有人说这句不好用,会报error 1396,在我这里却没有什么问题,可能和版本有关系吧,如果你在使用的时候报错,可以用这句

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

到这里,应该没有什么问题了,那就这样吧

5.14更新
今天在部署到服务器上时又出问题了,依然显示driver not loaded,百思不得其解,我自己编译的驱动,在我自己的电脑上怎么造都没有问题,mysql的版本两者之间是一致的,怎么驱动又加载不上了呢?
由于服务端使用的系统是Windows server 2008,我自己当然是win10啦,就怀疑是不是connector c 不兼容的问题,之后下载了connector6.0.2,重新编译驱动,再次尝试一次性成功。

最后说说导入数据时报too long for column 的问题,大家都说修改my.ini的编码方式为utf-8。于是开开心心的到C:\ProgramData\MySQL\MySQL Server 8.0下面修改了my.ini。重启MySQL80服务,悲催的是,出现了一个莫名其妙的错误
使用QT连接MySql的那些坑_第15张图片
于是一大堆经验出来了,删除Data文件夹,重装。还好我对my.ini做了备份,恢复my.ini,重启,重启成功。事实证明,修改my.ini中编码格式没有用,我又不想去改代码,好大一堆的,等改完了,黄花菜都凉了。于是继续找,还好苦心人天不负,最后让我找到了,就是这个,修改my.ini中的这一句

# Set the SQL mode to strict
#sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
sql-mode="NO_ENGINE_SUBSTITUTION"

修改完成后重启服务,导入就没有问题了

5.15更新

在做完上面的事情以后,我本以为可以高枕无忧了,然而事情的严重程度超乎我的想象。在测试软件的其他功能时,有部分数据无法显示,之前是正常的,那应该还是编码的问题了。
做一个复盘,在使用命令行插入数据时显示正常,使用我的软件插入数据显示乱码,导出数据后在其他的软件下显示正常。
下面查看编码方式
win编码
显然,windows默认编码是GBK,我把之前对mysql中my.ini所做的修改都改回去,查看mysql的编码
使用QT连接MySql的那些坑_第16张图片
很明显的,client,connection和result的编码格式都是GBK,使用命令行写入数据也正常,说明mysql的编码是没有问题的,那么为什么会乱码呢?
原来又是坑爹的connector,我用了老版本的connector c,mysql认为它用GBK编码,但是他用什么鬼东西编码就不知道了,因此在这种情况下,修改这三者的编码方式是有必要的
打开my.ini ,做如下修改

[client]
default_character_set=编码格式
# pipe=

# socket=MYSQL

port=3306

当然,这是在知道connector c的编码方式的前提下。更为简便的方法是换用较新版本的connector c。

你可能感兴趣的:(QT)