Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Installation and Deployment
  4. Different versions of Qt with different versions of MySQL

Different versions of Qt with different versions of MySQL

Scheduled Pinned Locked Moved Solved Installation and Deployment
8 Posts 2 Posters 1.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V Offline
    V Offline
    vinit320
    wrote on last edited by
    #1

    I have been a long time user of Qt. I primarily code on Ubuntu, so my query here relates only to Ubuntu distributions.

    Now as of yesterday, Ubuntu 20.04 LTS has been released. I was using Ubuntu 18.04 before this. Now Ubuntu 18.04 use to ship with both MySQL 5.x and MySQL 8.x and it was upto the user which version to install.

    With 20.04, the default package is MySQL 8.x only. I do not have any issues with using version 8, its just that version 8 does not seem to have compatibility with Qt 5.9.9.
    I have recently developed apps based on Qt 5.9.9 that utilize MySQL 5.

    I always download the Qt installers from the Qt website, and build my own MySQL plugins. So when I was trying to set up Qt 5.9.9 in Ubuntu 20.04, I realized that the plugin simply would not compile. I then went ahead and downloaded Qt 5.14.2 (latest as of posting this), followed the same steps for building MySQL plugin, and it went ahead without any problems.

    So my question is, is there a way to use MySQL 8 in Qt 5.9.9? Or can I run separate versions of Qt with separate versions of MySQL (PREFERABLY DONT WANT THIS).
    Other option is to use MariaDB, but I do not seem to find any guide to install it. Also MariaDB 10.4 seems to be based on a fork of MySQL 8.

    Any ideas or suggestions?

    jsulmJ 1 Reply Last reply
    0
    • V vinit320

      I have been a long time user of Qt. I primarily code on Ubuntu, so my query here relates only to Ubuntu distributions.

      Now as of yesterday, Ubuntu 20.04 LTS has been released. I was using Ubuntu 18.04 before this. Now Ubuntu 18.04 use to ship with both MySQL 5.x and MySQL 8.x and it was upto the user which version to install.

      With 20.04, the default package is MySQL 8.x only. I do not have any issues with using version 8, its just that version 8 does not seem to have compatibility with Qt 5.9.9.
      I have recently developed apps based on Qt 5.9.9 that utilize MySQL 5.

      I always download the Qt installers from the Qt website, and build my own MySQL plugins. So when I was trying to set up Qt 5.9.9 in Ubuntu 20.04, I realized that the plugin simply would not compile. I then went ahead and downloaded Qt 5.14.2 (latest as of posting this), followed the same steps for building MySQL plugin, and it went ahead without any problems.

      So my question is, is there a way to use MySQL 8 in Qt 5.9.9? Or can I run separate versions of Qt with separate versions of MySQL (PREFERABLY DONT WANT THIS).
      Other option is to use MariaDB, but I do not seem to find any guide to install it. Also MariaDB 10.4 seems to be based on a fork of MySQL 8.

      Any ideas or suggestions?

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #2

      @vinit320 Do you have to use Qt 5.9.9? If not try with the current one.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • V Offline
        V Offline
        vinit320
        wrote on last edited by
        #3

        Yes. I have Qt 5.9.9. It doesnt compile plugin for MySQL 8, only MySQL 5. Qt 5.14.2 compiles for MySQL 8.

        1 Reply Last reply
        0
        • V Offline
          V Offline
          vinit320
          wrote on last edited by
          #4

          Have you tried building plugin for MySQL 8 using Qt 5.9.9?

          jsulmJ 1 Reply Last reply
          0
          • V vinit320

            Have you tried building plugin for MySQL 8 using Qt 5.9.9?

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by
            #5

            @vinit320 said in Different versions of Qt with different versions of MySQL:

            Have you tried building plugin for MySQL 8 using Qt 5.9.9?

            No. If you share what you did and what problems/errors you got maybe somebody can help

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            1 Reply Last reply
            0
            • V Offline
              V Offline
              vinit320
              wrote on last edited by
              #6

              OK.

              To summarize, I have the following installed on Ubuntu 20.04:

              1. mysql-server (version 8)
              2. mysql-client
              3. libmysqlclient-dev
              4. Qt 5.9.9 with source (downloaded from qt website)
              5. libssl-dev

              Since this has been installed via apt, I do not need to explicitly give paths while building the plugin. So now I go into the Qt 5.9.9 directory as follows:

              cd /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers
              

              There, I execute command:

              sudo /opt/Qt5.9.9/5.9.9/gcc_64/bin/qmake
              

              On this, I get the following output:

              Running configuration tests...
              Checking for DB2 (IBM)... no
              Checking for InterBase... no
              Checking for MySQL... yes
              Checking for OCI (Oracle)... no
              Checking for ODBC... no
              Checking for PostgreSQL... no
              Checking for SQLite (version 2)... no
              Checking for TDS (Sybase)... no
              Done running configuration tests.
              
              Configure summary:
              
              Qt Sql:
                DB2 (IBM) .............................. no
                InterBase .............................. no
                MySql .................................. yes
                OCI (Oracle) ........................... no
                ODBC ................................... no
                PostgreSQL ............................. no
                SQLite2 ................................ no
                SQLite ................................. yes
                  Using system provided SQLite ......... no
                TDS (Sybase) ........................... no
              
              Qt is now configured for building. Just run 'make'.
              Once everything is built, Qt is installed.
              You should NOT run 'make install'.
              Note that this build cannot be deployed to other machines or devices.
              
              Prior to reconfiguration, make sure you remove any leftovers from
              the previous build.
              

              This shows that MySQL has been detected correctly. All is well and good.

              Now, I go ahead and run make as follows (still in the same directory):

              sudo make
              

              And here's where the trouble begins. I get the following output:

              vinit320@vinit-desktop:/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers$ sudo make
              cd mysql/ && ( test -e Makefile || /opt/Qt5.9.9/5.9.9/gcc_64/bin/qmake -o Makefile /opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/mysql/mysql.pro ) && make -f Makefile 
              make[1]: Entering directory '/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/mysql'
              g++ -c -pipe -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -D_REENTRANT -fPIC -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql/5.9.9 -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql/5.9.9/QtSql -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/5.9.9 -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/5.9.9/QtCore -I/opt/Qt5.9.9/5.9.9/gcc_64/include -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtSql -I/opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore -I.moc -isystem /usr/include/mysql -I/opt/Qt5.9.9/5.9.9/gcc_64/mkspecs/linux-g++ -o .obj/qsql_mysql.o qsql_mysql.cpp
              In file included from qsql_mysql.cpp:43:
              /opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/qvariant.h: In constructor ‘QVariant::QVariant(QVariant&&)’:
              /opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/qvariant.h:265:25: warning: implicitly-declared ‘constexpr QVariant::Private& QVariant::Private::operator=(const QVariant::Private&)’ is deprecated [-Wdeprecated-copy]
                265 |     { other.d = Private(); }
                    |                         ^
              /opt/Qt5.9.9/5.9.9/gcc_64/include/QtCore/qvariant.h:380:16: note: because ‘QVariant::Private’ has user-provided ‘QVariant::Private::Private(const QVariant::Private&)’
                380 |         inline Private(const Private &other) Q_DECL_NOTHROW
                    |                ^~~~~~~
              qsql_mysql.cpp: At global scope:
              qsql_mysql.cpp:235:9: error: ‘my_bool’ does not name a type; did you mean ‘bool’?
                235 |         my_bool nullIndicator;
                    |         ^~~~~~~
                    |         bool
              qsql_mysql.cpp: In constructor ‘QMYSQLResultPrivate::QMyField::QMyField()’:
              qsql_mysql.cpp:231:28: error: class ‘QMYSQLResultPrivate::QMyField’ does not have any field named ‘nullIndicator’
                231 |             : outField(0), nullIndicator(false), bufLength(0ul),
                    |                            ^~~~~~~~~~~~~
              qsql_mysql.cpp: In member function ‘bool QMYSQLResultPrivate::bindInValues()’:
              qsql_mysql.cpp:429:28: error: ‘struct QMYSQLResultPrivate::QMyField’ has no member named ‘nullIndicator’
                429 |         bind->is_null = &f.nullIndicator;
                    |                            ^~~~~~~~~~~~~
              qsql_mysql.cpp: In member function ‘virtual QVariant QMYSQLResult::data(int)’:
              qsql_mysql.cpp:640:15: error: ‘const struct QMYSQLResultPrivate::QMyField’ has no member named ‘nullIndicator’
                640 |         if (f.nullIndicator)
                    |               ^~~~~~~~~~~~~
              qsql_mysql.cpp: In member function ‘virtual bool QMYSQLResult::isNull(int)’:
              qsql_mysql.cpp:733:35: error: ‘const struct QMYSQLResultPrivate::QMyField’ has no member named ‘nullIndicator’
                733 |        return d->fields.at(field).nullIndicator;
                    |                                   ^~~~~~~~~~~~~
              qsql_mysql.cpp: In member function ‘virtual bool QMYSQLResult::exec()’:
              qsql_mysql.cpp:986:13: error: ‘my_bool’ was not declared in this scope; did you mean ‘bool’?
                986 |     QVector<my_bool> nullVector;
                    |             ^~~~~~~
                    |             bool
              qsql_mysql.cpp:986:20: error: template argument 1 is invalid
                986 |     QVector<my_bool> nullVector;
                    |                    ^
              qsql_mysql.cpp:1000:20: error: request for member ‘resize’ in ‘nullVector’, which is of non-class type ‘int’
               1000 |         nullVector.resize(values.count());
                    |                    ^~~~~~
              qsql_mysql.cpp:1007:25: error: invalid types ‘int[int]’ for array subscript
               1007 |             nullVector[i] = static_cast<my_bool>(val.isNull());
                    |                         ^
              qsql_mysql.cpp:1007:41: error: ‘my_bool’ does not name a type; did you mean ‘bool’?
               1007 |             nullVector[i] = static_cast<my_bool>(val.isNull());
                    |                                         ^~~~~~~
                    |                                         bool
              qsql_mysql.cpp:1008:46: error: invalid types ‘int[int]’ for array subscript
               1008 |             currBind->is_null = &nullVector[i];
                    |                                              ^
              qsql_mysql.cpp:1104:16: error: expected ‘;’ before ‘update_max_length’
               1104 |         my_bool update_max_length = true;
                    |                ^~~~~~~~~~~~~~~~~~
                    |                ;
              qsql_mysql.cpp:1113:72: error: ‘update_max_length’ was not declared in this scope
               1113 |             mysql_stmt_attr_set(d->stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &update_max_length);
                    |                                                                        ^~~~~~~~~~~~~~~~~
              qsql_mysql.cpp: In member function ‘virtual bool QMYSQLDriver::open(const QString&, const QString&, const QString&, const QString&, int, const QString&)’:
              qsql_mysql.cpp:1315:5: error: ‘my_bool’ was not declared in this scope; did you mean ‘bool’?
               1315 |     my_bool reconnect=false;
                    |     ^~~~~~~
                    |     bool
              qsql_mysql.cpp:1333:21: error: ‘reconnect’ was not declared in this scope; did you mean ‘connect’?
               1333 |                     reconnect = true;
                    |                     ^~~~~~~~~
                    |                     connect
              qsql_mysql.cpp:1414:13: error: ‘reconnect’ was not declared in this scope; did you mean ‘connect’?
               1414 |         if (reconnect)
                    |             ^~~~~~~~~
                    |             connect
              make[1]: *** [Makefile:738: .obj/qsql_mysql.o] Error 1
              make[1]: Leaving directory '/opt/Qt5.9.9/5.9.9/Src/qtbase/src/plugins/sqldrivers/mysql'
              make: *** [Makefile:46: sub-mysql-make_first] Error 2
              

              If the same steps are followed for Qt 5.14.2, it works and I am able to run sudo make install. This leads me to believe that Qt 5.9.9 is simply not compatible with MySQL 8.

              So, any ideas what can be done?

              1 Reply Last reply
              0
              • V Offline
                V Offline
                vinit320
                wrote on last edited by
                #7

                So I managed to get MariaDB working with Qt 5.9.9 flawlessly.
                But still unable to get MySQL 8 to work.

                Any suggestions?

                1 Reply Last reply
                0
                • V Offline
                  V Offline
                  vinit320
                  wrote on last edited by
                  #8

                  Ok. So I have found the solution.

                  MySQL 8 replaces my_bool with bool. So if using a previous Qt version (before Qt 12 mostly), simply edit the qsql_mysql.cpp file in the src/plugins/sqldrivers/mysql directory and the following line after the #include statements.

                  typedef bool my_bool
                  

                  Hopefully this helps someone out. Please note this is only required if using MySQL 8 on versions of QT before QT 12. QT 12+ supports native building of plugins for MySQL 8.

                  1 Reply Last reply
                  2

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved