ScyllaDB插入报错:Int32Type验证失败,收到8字节数据
问题原因及解决方案
报错原因
ScyllaDB的int类型对应32位有符号整数(占4字节),你的代码存在两个核心问题导致类型序列化不匹配:
- Node.js的
number是64位浮点数类型,直接传递或用全局int()转换后,驱动会将其序列化为8字节的64位值,和Scylla要求的4字节32位int格式冲突,触发校验错误。 - 代码中使用的
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
相关产品推荐
相关产品推荐

