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

Python int过大无法转换为SQLite INTEGER报错如何解决?

问题原因

SQLite 原生支持的 INTEGER 类型为64位有符号整数,取值范围仅覆盖 -9223372036854775808 到 9223372036854775807,而Python支持任意精度的大整数,当你存入的int值超出上述范围时,就会触发Python int too large to convert to SQLite INTEGER报错,你提到的阈值9126776637782808953已经非常接近64位有符号整数的上限。

修复方案
  • 方案1:修改表结构使用TEXT类型存储大整数
    建表时将对应字段的类型从INTEGER改为TEXT,写入时直接把大整数转成字符串存入,读取后再转回int类型即可,适用于不需要在SQL层对该字段做数值比较、运算的场景。
    示例代码:

    # 写入时转换
    large_int = 9126776637782808954
    cursor.execute("INSERT INTO table_name (large_num_field) VALUES (?)", (str(large_int),))
    # 读取后转换
    cursor.execute("SELECT large_num_field FROM table_name WHERE id = ?", (target_id,))
    res = int(cursor.fetchone()[0])
    
  • 方案2:自定义SQLite适配/转换器
    可以给Python的sqlite3模块注册大整数的适配和转换规则,自动完成字符串和大整数的双向转换,无需手动处理每个读写逻辑:

    import sqlite3
    
    # 注册适配器:Python int转SQLite存储的字符串
    def adapt_large_int(val):
        return str(val)
    # 注册转换器:SQLite读取的字符串转回Python int
    def convert_large_int(val):
        return int(val)
    
    sqlite3.register_adapter(int, adapt_large_int)
    sqlite3.register_converter("LARGEINT", convert_large_int)
    
    # 连接数据库时开启类型检测
    conn = sqlite3.connect("test.db", detect_types=sqlite3.PARSE_DECLTYPES)
    cursor = conn.cursor()
    # 建表时指定字段类型为LARGEINT
    cursor.execute("CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY, num LARGEINT)")
    # 直接写入大整数即可,无需手动转换
    large_num = 9126776637782808954
    cursor.execute("INSERT INTO test_table (num) VALUES (?)", (large_num,))
    conn.commit()
    
  • 方案3:使用BLOB类型存储
    也可以将大整数序列化后以二进制BLOB形式存入,适合需要加密存储或者对存储空间有要求的场景,读写时需要做序列化和反序列化处理。

  • 方案4:使用REAL类型存储(仅适合低精度要求场景)
    如果对精度要求不高,可以将字段改为REAL浮点类型存储,但超过2^53的整数会有精度丢失风险,仅适用于数值粗略统计的场景。

内容的提问来源于stack exchange,提问作者주식마스터

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:12:00