Sequelize where条件包含emoji时查询返回错误记录的问题
问题根因
绝大多数情况都是reaction字段的排序规则(collation)配置问题:
- 你大概率给字段用了
utf8mb4_general_ci这类通用排序规则,这类规则为了提升排序效率,会给很多字形相近的Unicode字符(包括这几个圆形彩色emoji)设置相同的权重值,比较时会被判定为相等。匹配时就会返回满足其他条件的第一条记录,也就是你存储的第一条🟡的记录。 - 小概率是数据库连接层没有显式指定utf8mb4编码,导致传入的emoji被转义为相同的占位符,不过从你生成的SQL语句里已经正常带了对应emoji来看,这个可能性很低。
排查步骤
- 确认字段排序规则
直接执行SQL查看reaction字段的配置:
SHOW FULL COLUMNS FROM Roles WHERE Field = 'reaction';
如果返回结果的Collation列显示为utf8mb4_general_ci/utf8mb4_unicode_ci这类非二进制排序规则,即可确认问题。
- 验证匹配逻辑
手动在数据库执行你生成的查询🔵的SQL,看返回结果:
SELECT * FROM `Roles` WHERE `Roles`.`guildId` = '844213646163050496' AND `Roles`.`messageId` = '855360336462217246' AND `Roles`.`type` = 'REACTION' AND `Roles`.`reaction` = '🔵';
如果返回了全部4条不同emoji的记录,就完全确认是排序规则导致所有emoji被判定为相等。
修复方案
将reaction字段的排序规则修改为二进制排序规则utf8mb4_bin即可,修改时注意保持你原字段的长度、非空等属性和原来一致,示例SQL:
ALTER TABLE Roles MODIFY COLUMN reaction VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;
修改完成后再执行查询就可以精确匹配不同的emoji了。
内容的提问来源于stack exchange,提问作者Feralheart
相关产品推荐
相关产品推荐

