logo
AI对话
AI写作
AI学术
AI绘画
知识社区

解决数据库字符集不匹配问题的简单方法与技巧

此对话是使用 海鲸AI 创建的 • 发布时间:2025年03月22日 23:18

Error: select count(*) as count from posts where title like ‘%你好%’ COLLATE utf8_bin limit 1 - COLLATION ‘utf8_bin’ is not valid for CHARACTER SET ‘utf8mb4’

复制问题

这个错误是因为数据库中的字符集和排序规则不匹配。错误提示显示你尝试对 utf8mb4 字符集的列使用 utf8_bin 排序规则,这是不兼容的。

解决方案

你需要修改查询以使用与数据库 utf8mb4 字符集兼容的排序规则。以下是几种可能的解决方法:

方法 1: 使用兼容的排序规则

if (title) {
  // 使用兼容 utf8mb4 的排序规则
  query = query.whereRaw('title LIKE ? COLLATE utf8mb4_bin', [`%${title}%`]);
}

方法 2: 不指定排序规则,使用数据库默认值

if (title) {
  // 不指定 COLLATE,使用数据库默认排序规则
  query = query.whereRaw('title LIKE ?', [`%${title}%`]);
}

方法 3: 使用 Knex 内置的 like 方法

if (title) {
  query = query.where('title', 'like', `%${title}%`);
}

完整示例代码

// 定义基础查询
let query = knex('posts');

// 添加条件
if (title) {
  // 使用 where 方法的 like 功能,让 Knex 处理排序规则
  query = query.where('title', 'like', `%${title}%`);
}
if (category && category != 'all') {
  query = query.where('category', category);
}

// 计算总数
const countResult = await query.clone().count('* as count').first();

const count = parseInt(countResult.count, 10);
const totalPages = Math.ceil(count / pageSize);
const isLastPage = pageNumber === totalPages;

// 获取帖子
const posts = await query
  .select(
    'posts.post_id',
    'posts.title',
    'posts.type',
    'posts.category',
    'posts.image',
    'posts.tags',
    'posts.view_count',
    'posts.desc'
  )
  .orderBy('posts.sort', 'desc')
  .orderBy('posts.created_at', 'desc')
  .limit(pageSize)
  .offset((pageNumber - 1) * pageSize);

这个方法应该能够解决字符集和排序规则不匹配的问题。如果你仍然遇到类似的错误,可能需要检查你的数据库配置,确认所有表和列都使用一致的字符集和排序规则。

重新生成
语音播放
复制回答