最近一个项目需要连接一个比较老的oracle数据库,数据库编码方式是SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280,也就是GBK编码。我的系统环境是QT5.6.3+MINGW4.9.2 32bit+ win7 64位系统。
安装完oracle10g客户端,用odbcad32.exe使用系统自带Microsoft ODBC driver for oracle驱动或oracle in oraclient10g_home1 驱动(均一样的效果)配置好ODBC数据源,利用本机的plsql和sqlplus登陆,查询中文均正常显示。目前oracle服务端和客户端编码均一致,且均可正常显示中文。
使用QT5.6.3(源码UTF-8) MINGW编译程序利用QSqlDatabase借助于QODBC连接到oracle数据库,连接及查询均正常,但是返回值中存在中文时,所有中文均显示为“?”。
代码如下:
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("test");
db.setUserName("xxx");
db.setPassword("xxx");
if (!db.open()) {
QMessageBox::information(this,tr("警告"),tr("无法连接数据库"));
return;
}
QSqlQuery query(db);
query.exec("select vlty_id,vlty_name,vbase from vl_type order by vlty_id");
QString name;
int id;
while (query.next()) {
id = query.value(0).toInt();
name = query.value(1).toString(); //读出来是乱码
ui->textBrowser->append(name);
}
name读出是乱码,其实一个gbk编码的QString,相当于如下代码。
QString str1=”中文”;
QString name2=QString(str. toLocal8Bit());
数据库取出来的name乱码等同于name2
使用了很多办法进行转码,都不行,有大神可以尝试一下name2转成正常的utf-8中文。查了很多资料,说是QT5中QODBC驱动qsqlodbc.dll qsqlodbcd.dll的bug。
翻看以前的程序代码发现在QT4中使用vs2005+QT4.5+QODBC可以正确读出数据库中文,到了QT5就是死活不行了。折腾了几天,决定放弃使用QODBC(也许高版本的QT5解决了这个问题,知道的请告诉我),重新编译QOCI驱动后使用QOCI可以正确读取中文,保存数据库中文也均正常。
注:还有个interbase7.5的数据库(也是使用GBK编码),一样使用QODBC读取数据库中文乱码,应该是一样的问题。