2011-02-15 68 views
0

我使用Qt4和MySQL5对二进制值的字符编码有一些问题。Qt4和MySQL5 - 作为二进制数据绑定QByteArray“1:1”

假设我们想绑定一个包含四个字节0​​的值。我检查使用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"这显然是解释为latin1的编码的字符串,然后编码为UTF8字符串的\xDE \xAD \xBE \xEF十六进制代码。

如果我不使用addBindValue()将值绑定,但将其直接放入查询中,使用UNHEX('DEADBEEF')将导致预期行为(这并不令人意外......)。

UTF8编码步骤发生在哪里?

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

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

提前感谢!

+0

好吧,我认为这与我的MySQL服务器本身的设置有关。我如何检查/测试/设置默认连接编码? – leemes 2011-02-18 20:49:16

回答

0

经过几个星期的反复试验,我发现的唯一解决方案是以十六进制代码传输二进制数据,并在查询中传输UNHEX()

的解决方案,所以我让自己接受我自己的答案,但它不是一个很好的解决方案,我没有解释上述代码的行为。

所以,如果您有任何建议,我期待着任何进一步的答案。 (我会接受你的回答。)谢谢!