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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:20:33