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
相关产品推荐
相关产品推荐

