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

Adonis.js中utf8mb4与utf8_bin冲突:如何兼顾emoji与查询?

解决utf8mb4字符集下查询排序规则不兼容问题

你的报错核心原因是查询中指定的utf8_bin排序规则,和数据库连接设置的utf8mb4字符集不兼容——utf8_bin仅适配旧版的utf8字符集,无法与支持emoji的utf8mb4配合使用。以下是具体解决步骤:

1. 修正查询语句中的排序规则

把查询里的COLLATE utf8_bin替换为utf8mb4对应的排序规则,比如utf8mb4_bin(大小写敏感)、utf8mb4_unicode_ci(通用排序)或utf8mb4_general_ci(简单排序)。用Knex构建查询的话,调整whereRaw部分:

原错误查询示例:

knex('users')
  .select('id', 'full_name', 'profile_pic')
  .where('school_id', 1)
  .whereExists(function() {
    this.select('*').from('groupmembers')
      .where('group_id', '110')
      .whereRaw('users.id = groupmembers.user_id')
  })
  .whereRaw('full_name like ? COLLATE utf8_bin', ['%d%'])

修改后:

knex('users')
  .select('id', 'full_name', 'profile_pic')
  .where('school_id', 1)
  .whereExists(function() {
    this.select('*').from('groupmembers')
      .where('group_id', '110')
      .whereRaw('users.id = groupmembers.user_id')
  })
  .whereRaw('full_name like ? COLLATE utf8mb4_bin', ['%d%'])

2. 统一数据库表的字符集与排序规则

确保users表的full_name字段、groupmembers表的相关字段,都使用utf8mb4字符集和匹配的排序规则。如果用Adonis.js迁移文件创建/修改表,字段定义示例:

table.string('full_name', 255)
  .charset('utf8mb4')
  .collate('utf8mb4_bin')

3. 全局配置数据库连接的默认排序规则

在Adonis.js的数据库配置文件(config/database.js)中,给mysql连接添加默认排序规则,这样所有查询会自动使用该规则,无需手动指定:

module.exports = {
  connection: 'mysql',
  mysql: {
    client: 'mysql',
    connection: {
      host: Env.get('DB_HOST', '127.0.0.1'),
      port: Env.get('DB_PORT', '3306'),
      user: Env.get('DB_USER', 'root'),
      password: Env.get('DB_PASSWORD', ''),
      database: Env.get('DB_DATABASE', 'adonis'),
      charset: 'utf8mb4',
      collation: 'utf8mb4_bin' // 新增默认排序规则
    },
    // 其他配置...
  }
}

内容的提问来源于stack exchange,提问作者Hkm Sadek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:15:30