About Blog PGP Key

All articles, tagged with “mysql”

Qt, MySQL

Понадобилась мне мелкая Qt-ная апликуха, которая бы умела выгребать данные из MySQL базы. Наступил на какие-то непонятные грабли.

Вот такой вот запрос работает:

SELECT COUNT(*) FROM table;

Возвращается 807 — количество записей. А вот такой запрос возвращает по какой-то причине всего 37 записей:

SELECT * FROM table;

Путем добавления всяких ORDERED BY и LIMIT/OFFSET удалось подобрать запись, на которой всё стопается. Вот такой вот запрос не возвращает ничего:

SELECT * FROM table WHERE id=1234

(Запись с id = 1234 существует). Дальше пришло в голову вот такое:

SELECT COUNT(*) FROM (SELECT * FROM table WHERE id=1234) as tbl;

Такой запрос вернул цифру “1”. То есть запись на самом деле есть.

Дальше я взял в руки GDB и начал дебажиться по libqt4-sql-mysql. За несколько проходов понять ничего не вышло. Потом я увидел следующий код ($QTDIR/sql/drivers/mysql/qsql_mysql.cpp, конец функции bool QMYSQLDriver::open()):

#if MYSQL_VERSION_ID >= 40108
    d->preparedQuerysEnabled = mysql_get_client_version() >= 40108
                        && mysql_get_server_version(d->mysql) >= 40100;
#else
    d->preparedQuerysEnabled = false;
#endif

Ну я, подумав что не зря для каких-то версий мускуля Prepared запросы отключали, вырубил их нафиг и пересобрал либу. После этого всё заработало.

Выглядит это всё очень странно. Command Line клиент пользуется обычными Query без Prepare/Execute.

PS. Qt 4.5.1.