我在使用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
提前致谢!
答案 0 :(得分:0)
经过数周的反复试验,我找到的唯一解决方案是以十六进制代码传输二进制数据,并在查询中传递UNHEX()
。
这个 是一个解决方案,所以我允许自己接受我自己的答案,但这不是一个好的解决方案,我对上面代码的行为没有任何解释。
因此,如果您有任何建议,我期待着任何进一步的答复。 (然后我会接受你的回答。)谢谢!