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

ScyllaDB插入报错:Int32Type验证失败,收到8字节数据

问题原因及解决方案

报错原因

ScyllaDB的int类型对应32位有符号整数(占4字节),你的代码存在两个核心问题导致类型序列化不匹配:

  1. Node.js的number是64位浮点数类型,直接传递或用全局int()转换后,驱动会将其序列化为8字节的64位值,和Scylla要求的4字节32位int格式冲突,触发校验错误。
  2. 代码中使用的int(user_id)不是Scylla驱动提供的类型转换方法,无法正确告知驱动要按32位整数格式序列化数据。

解决方法

方法1:使用驱动提供的32位整数转换方法

修改代码中int(user_id)为Scylla驱动的scyllaDB.types.int(),确保数值被序列化为符合要求的32位int格式:

async function insertGameSession(user_id, start_date, gameId) {
    const session_id = scyllaDB.types.TimeUuid.now();

    const query = `
        INSERT INTO game_sessions (session_id, user_id, game_id, start_date, end_date)
        VALUES (?, ?, ?, ?, null);
    `;

    // 使用驱动的int类型包装user_id和gameId
    await dbcllient.execute(query, [session_id, scyllaDB.types.int(user_id), scyllaDB.types.int(gameId), start_date]);

    return session_id;
}

注意:必须确保user_id和gameId的数值在32位有符号整数范围内(-2147483648 到 2147483647),超出范围会触发溢出错误。

方法2:调整表结构为64位整数(如果用户ID超出32位范围)

如果你的user_id数值超过32位整数上限,需要先修改ScyllaDB表结构,将user_id和game_id的类型改为bigint:

ALTER TABLE game_sessions ALTER user_id TYPE bigint;
ALTER TABLE game_sessions ALTER game_id TYPE bigint;

然后代码中使用驱动的scyllaDB.types.bigint()来转换数值:

async function insertGameSession(user_id, start_date, gameId) {
    const session_id = scyllaDB.types.TimeUuid.now();

    const query = `
        INSERT INTO game_sessions (session_id, user_id, game_id, start_date, end_date)
        VALUES (?, ?, ?, ?, null);
    `;

    await dbcllient.execute(query, [session_id, scyllaDB.types.bigint(user_id), scyllaDB.types.bigint(gameId), start_date]);

    return session_id;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:02:08