Node.js写入MySQL的Byte数组长度异常增大问题求助
问题原因及解决方案
为什么字节数组长度变大?
- 你直接把Byte数组拼进SQL字符串的操作是错误的。当二进制数组和字符串拼接时,Node.js会自动调用数组的
toString()方法,把二进制数据转成UTF-8字符串。但二进制数据里大量字节序列不符合UTF-8编码规则,这些无效序列会被替换成替换字符�(U+FFFD),每个替换字符占3个字节。这就导致原二进制数据被篡改,插入BLOB后再读取,字节长度自然大幅膨胀。 - 另外,这种直接拼接SQL的写法还存在严重的SQL注入风险,属于不安全的编码方式。
怎么解决?
使用Node.js MySQL库的参数化查询(预处理语句),让库自动处理二进制数据与BLOB类型的正确映射,避免编码转换错误:
修改插入代码
// 用?作为参数占位符,不要直接拼接字符串 const query = "INSERT INTO spreaddata.workbook SET user_email = ?, workbook_data = ?"; // 将参数放入数组,传给query方法 connection.query(query, [userEmail, workbook_data], (err, results) => { if (err) throw err; console.log("数据插入完成"); });
修改查询代码
const selectQuery = "SELECT * from spreaddata.workbook WHERE user_email = ?"; connection.query(selectQuery, ['name@company.com'], (err, results) => { if (err) throw err; const workbookData = results[0].workbook_data; console.log("读取到的字节数组长度:", workbookData.length); // 此时长度应为9459 });
内容的提问来源于stack exchange,提问作者Dattatreya Kugve
相关产品推荐
相关产品推荐

