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拼写错误,应为cursorprint(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
相关产品推荐
相关产品推荐

