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

MySQL报错1300:配置utf8mb4连接后仍无法存储Unicode emoji怎么办

解决方案

1. 确认数据库、表、存储emoji的字段字符集均为utf8mb4

仅修改连接字符集不足以解决问题,需要存储层的字符集也支持4字节的utf8编码:

  • 查看当前库字符集:SHOW CREATE DATABASE 你的数据库名;
  • 修改库字符集:ALTER DATABASE 你的数据库名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  • 查看表字符集:SHOW CREATE TABLE RR_Roles;
  • 修改表及所有字段字符集:ALTER TABLE RR_Roles CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 如需单独修改emoji存储字段(以varchar类型为例):ALTER TABLE RR_Roles MODIFY COLUMN emoji VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 修复SQL拼接的错误写法,使用参数化查询

你当前使用f字符串直接拼接SQL,一方面存在SQL注入风险,另一方面字符串转义过程会破坏emoji的编码结构,同时你的代码中还存在变量未定义的问题({emoji}未声明,应为payload.emoji)。请修改为pymysql的参数化查询写法:

def foo(payload):
    cursor = self.bot.mydb.cursor()
    # 用%s做占位符,参数通过execute第二个参数传递
    cursor.execute(
        "SELECT role FROM RR_Roles INNER JOIN RR_Panels ON RR_Roles.panel_id = %s WHERE emoji = %s AND guild = %s AND message = %s",
        (payload.id, payload.emoji, payload.channel_id, payload.message_id)
    )
    print(cursor.fetchone()[0])
    cursor.close()

同时修正你代码中的其他语法错误:

  • 函数定义def foo(payload)后缺失冒号
  • curosor拼写错误,应为cursor
  • print(curosor.fetchone()[0]缺失右括号

3. 可选:补充连接配置与MySQL服务端配置

  • 连接数据库时补充初始化命令,确保连接会话字符集正确:
mydb = mysql.connect(
    host=os.getenv("db_host", "localhost"),
    user=os.getenv("db_username", "Mashu"),
    password=os.getenv("db_password"),
    port=self._tunnel.local_bind_port,
    db=os.getenv("database"),
    charset='utf8mb4',
    init_command='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
)
  • 如为自行部署的MySQL服务,修改配置文件my.cnf(Windows为my.ini),添加如下配置后重启MySQL服务:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:03