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);
这个方法应该能够解决字符集和排序规则不匹配的问题。如果你仍然遇到类似的错误,可能需要检查你的数据库配置,确认所有表和列都使用一致的字符集和排序规则。
重新生成
语音播放
复制回答