Qt4和MySQL5 - 将QByteArray“1:1”绑定为二进制数据

时间:2011-02-15 18:51:21

标签: sql mysql qt encoding binary

我在使用Qt4和MySQL5时对二进制值的字符编码存在一些问题。

假设我们要绑定一个包含四个字节\xDE \xAD \xBE \xEF的值。我使用以下代码使用MySQL函数HEX()检查绑定值:

#include <QtGui/QApplication>
#include <QDebug>
#include <QSqlQuery>
#include <QVariant>
#include <QSqlRecord>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    if(!db.open("test", "test"))
        exit(1);

    QSqlQuery q("SELECT HEX(?)");
    q.addBindValue(QVariant(QByteArray::fromHex("DEADBEEF")));
    if(!q.exec())
        exit(1);
    if(!q.next())
        exit(1);

    qDebug() << q.record().value(0).toString();

    return a.exec();
}

此代码的输出为"DEADEFBFBDEFBFBD",显然是\xDE \xAD \xBE \xEF的HEX代码,被解释为latin1编码的字符串,然后编码为UTF8字符串。

如果我没有使用addBindValue()绑定值,但是使用UNHEX('DEADBEEF')将其直接放入查询中会导致预期的行为(这并不奇怪......)。

UTF8编码步骤在哪里发生?

(最后,我想将二进制值“1:1”存储到BLOB字段中。)

OS: Ubuntu 10.10(32位)
Qt版本: 4.7.0(Ubuntu包)
MySQL版本: 5.1.49-1ubuntu8.1

提前致谢!

1 个答案:

答案 0 :(得分:0)

经过数周的反复试验,我找到的唯一解决方案是以十六进制代码传输二进制数据,并在查询中传递UNHEX()

这个 是一个解决方案,所以我允许自己接受我自己的答案,但这不是一个好的解决方案,我对上面代码的行为没有任何解释。

因此,如果您有任何建议,我期待着任何进一步的答复。 (然后我会接受你的回答。)谢谢!