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

如何从PostgreSQL的NUMERIC列获取int64_t/uint64_t最大值?

解决方案

一、不修改驱动重映射QVariant类型

可以通过Qt的QSqlDriver::registerSqlType方法,手动将PostgreSQL的NUMERIC类型(OID为1700)映射为QString而非默认的qreal(double),彻底避免精度损失。具体操作如下:

  1. 在建立数据库连接后、执行查询前,注册自定义类型映射:
QSqlDatabase db = QSqlDatabase::database("your_connection_name");
if (db.isValid()) {
    QSqlDriver* driver = db.driver();
    // 将PostgreSQL NUMERIC类型(OID 1700)映射为Qt的QString类型
    driver->registerSqlType(1700, QVariant::String, "NUMERIC");
}
  1. 查询时直接读取QString值,再转换为目标整数类型:
QSqlQuery query("SELECT numeric_col FROM your_table", db);
while (query.next()) {
    QString numStr = query.value("numeric_col").toString();
    // 转换为int64_t
    qint64 intVal = numStr.toLongLong();
    // 转换为uint64_t
    quint64 uintVal = numStr.toULongLong();
}

这种方式无需修改驱动源码,仅通过代码层面的类型注册改变默认映射逻辑,且数据库端无需做任何额外转换。

二、无需转字符串的替代方案:用Bytea存储二进制数据

如果完全不想涉及字符串转换,可以将int64_t/uint64_t值以二进制形式存储在PostgreSQL的bytea类型列中,Qt读取后直接解析为对应整数类型:

数据库端存储

将64位整数转为十六进制字符串后,用DECODE函数存入bytea列:

-- 存储uint64_t最大值(18446744073709551615,对应十六进制FFFFFFFFFFFFFFFF)
INSERT INTO your_table (bytea_col) VALUES (DECODE('FFFFFFFFFFFFFFFF', 'hex'));
-- 存储int64_t最大值(9223372036854775807,对应十六进制7FFFFFFFFFFFFFFF)
INSERT INTO your_table (bytea_col) VALUES (DECODE('7FFFFFFFFFFFFFFF', 'hex'));

Qt端读取解析

读取bytea列的二进制数据,直接通过指针转换为64位整数(注意保持字节序一致,PostgreSQL的bytea默认使用系统字节序存储):

QSqlQuery query("SELECT bytea_col FROM your_table", db);
while (query.next()) {
    QByteArray rawData = query.value("bytea_col").toByteArray();
    if (rawData.size() == sizeof(quint64)) {
        // 解析为uint64_t
        quint64 uintVal = *reinterpret_cast<const quint64*>(rawData.constData());
        // 解析为int64_t
        qint64 intVal = *reinterpret_cast<const qint64*>(rawData.constData());
    }
}

该方式完全跳过字符串转换,直接以二进制形式存储和读取,无任何精度损失。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:45:03