You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QSqlQueryModel查询SAP HANA数据库时中文单元格显示空白问题求解

问题原因分析
  • SQLite中文正常的原因:Qt内置的SQLite驱动默认对Unicode友好,会自动处理UTF-8编码的中文字符,不需要额外配置编码参数。
  • SAP HANA出现空白的原因:你使用的QODBC驱动连接HANA时,两个配置错误导致转换失败:
    1. 连接串中写的encoding='utf-8'不是SAP HANA ODBC驱动识别的合法参数,没有实际生效
    2. HANA的NVARCHAR类型默认以UTF-16格式存储,驱动默认尝试将其转换为ASCII编码输出,中文字符不在ASCII范围内,触发-10427转换错误,直接返回空值,所以界面显示空白。
解决方案

方案1:修改ODBC连接串(优先尝试)

将你代码中setDatabaseName的拼接参数替换为HANA ODBC官方支持的字符集配置,修改后的代码如下:

# 替换原来的setDatabaseName行,去掉错误的encoding参数,添加CHAR_AS_UTF8和UNICODE参数
self._db.setDatabaseName(self._odbc+";SCROLLABLERESULT=TRUE;CHAR_AS_UTF8=1;UNICODE=TRUE")
  • CHAR_AS_UTF8=1:指定驱动将所有字符类型以UTF-8格式返回
  • UNICODE=TRUE:开启ODBC的Unicode支持,适配HANA的NVARCHAR类型

方案2:修改系统ODBC数据源配置

如果修改连接串后问题依旧,调整系统层面的ODBC数据源配置:

  1. 打开Windows系统的「ODBC数据源(64位)」管理器
  2. 找到你配置的SAP HANA数据源,点击「配置」
  3. 进入「高级设置」标签页,将字符集选项修改为UTF-8,保存配置后重启应用测试。

方案3:自定义QSqlQueryModel手动转码(兜底方案)

如果上述配置都不生效,可以重写QSqlQueryModel的data方法,手动对返回的原始字节流做编码转换:

from PyQt5.QtCore import Qt
from PyQt5.QtSql import QSqlQueryModel

class HanaSqlQueryModel(QSqlQueryModel):
    def data(self, index, role=Qt.DisplayRole):
        raw_value = super().data(index, role)
        # 仅对显示角色的字节类型数据做转码处理
        if role == Qt.DisplayRole and isinstance(raw_value, QByteArray):
            # 优先尝试UTF-8解码,若还是乱码可替换为GBK测试
            return str(raw_value, encoding="utf-8", errors="replace")
        return raw_value

使用时用自定义的HanaSqlQueryModel替换原来的QSqlQueryModel即可。

内容的提问来源于stack exchange,提问作者Lisen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:09:03