QT5中使用QODBC连接oracle数据库 读取字段中文乱码的问题

最近一个项目需要连接一个比较老的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读取数据库中文乱码,应该是一样的问题。

你可能感兴趣的:(QT学习资料,QODBC,Oracle)