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

PowerShell查询SQLite时Int64类型systemaddress值异常问题排查

SQLite大整数查询溢出问题的原因与解决方案

问题背景

现有不可修改的SQLite表结构:

CREATE TABLE starsystems
(
   name TEXT NOT NULL COLLATE NOCASE,
   systemaddress INT UNIQUE,
   CONSTRAINT combined_uniques UNIQUE (name, systemaddress)
)

表中存在一条数据:name: "61 Cygni",systemaddress: 5856288576210。使用PowerShell执行查询:

$oSQLiteDBCommand.Commandtext='SELECT name, systemaddress FROM starsystems WHERE name IS "61 Cygni" '

返回结果中systemaddress值变为-2046815534,疑似32位有符号整数溢出导致。


错误原因

SQLite的INT类型本身支持存储64位整数,但PowerShell依赖的SQLite驱动(如System.Data.SQLite)默认会将INT字段映射为32位有符号整数(Int32)。而5856288576210远超过32位有符号整数的最大值(2147483647),触发有符号整数溢出,数值被循环转换为负数-2046815534。


查询时的解决方法

有三种可行方案:

  1. 在SQL语句中强制转换类型
    使用SQLite的CAST函数将字段转为64位整数:
    SELECT name, CAST(systemaddress AS INTEGER) FROM starsystems WHERE name = '61 Cygni'
    
  2. 在PowerShell读取时显式转换
    读取结果时手动将字段值转为64位整数(long类型):
    $reader = $oSQLiteDBCommand.ExecuteReader()
    while ($reader.Read()) {
        $targetName = $reader["name"]
        $targetAddr = [long]$reader["systemaddress"]
        # 后续处理逻辑
    }
    
  3. 调整驱动配置
    部分SQLite驱动支持配置参数(如UseBigInts),初始化连接时开启该配置,让驱动默认将INT字段映射为64位整数。

修改systemaddress值时的注意事项

为避免写入时出现整数截断或溢出,需注意:

  • 显式指定参数类型为64位整数
    插入或更新数据时,不要直接传递数值,而是将参数转为long类型:
    # 示例:更新数据
    $cmd.CommandText = "UPDATE starsystems SET systemaddress = @addr WHERE name = @name"
    $cmd.Parameters.AddWithValue("@name", "61 Cygni")
    $cmd.Parameters.AddWithValue("@addr", [long]5856288576210)
    $cmd.ExecuteNonQuery()
    
  • 避免用字符串传递大整数
    不要将大整数转为字符串后传入参数,防止驱动解析时误转为32位整数。
  • 确认数值范围
    确保写入的systemaddress值不超过SQLite 64位整数的最大值(9223372036854775807),超出范围会被转为浮点数,导致精度丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:42:15