Discord.js中服务器名称含表情符号存入SQL致机器人崩溃求助
问题解决:Discord机器人添加服务器时因名称含表情崩溃
问题根源
你的代码直接拼接SQL字符串,当服务器名称包含表情(4字节Unicode字符)、单引号等特殊字符时,会破坏SQL语句的语法结构,导致数据库报错,进而引发机器人崩溃。同时这种写法存在严重的SQL注入风险。
解决方案
1. 使用参数化查询替代字符串拼接
参数化查询会让数据库驱动自动处理字符转义,完美解决特殊字符、表情导致的语法错误,同时杜绝SQL注入。
修正后的代码示例:
bot.on("guildCreate", guild => { let logoUrl = `https://cdn.discordapp.com/icons/${guild.id}/${guild.icon}`; console.log(guild.name); // 参数化SQL语句,用?作为占位符 const insertSql = "INSERT INTO `servers` (`discord_server_id`, `server_name`, `server_logo`) VALUES (?, ?, ?)"; // 单独传入参数数组 const params = [guild.id, guild.name, logoUrl]; // 执行查询并添加错误处理 connection.query(insertSql, params, (err) => { if (err) { console.error("服务器数据入库失败:", err); // 此处可添加自定义错误处理逻辑,避免机器人崩溃 return; } console.log(`已成功记录服务器: ${guild.name}`); }); });
2. 确保数据库支持表情存储
Discord的表情符号是4字节的Unicode字符,普通的utf8字符集无法存储,需要将servers表的server_name字段字符集设置为utf8mb4,排序规则推荐utf8mb4_unicode_ci。
如果是新建表,SQL语句示例:
CREATE TABLE `servers` ( `discord_server_id` VARCHAR(255) NOT NULL PRIMARY KEY, `server_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `server_logo` VARCHAR(512) );
如果是已有表,修改字段字符集:
ALTER TABLE `servers` MODIFY COLUMN `server_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
内容的提问来源于stack exchange,提问作者arthur hubaud
相关产品推荐
相关产品推荐

