迁移之后,我想搜索个nginx相关的文章,结果竟然搜不到,明明标题写着大大的nginx,我就觉得肯定出了问题。

Typecho的搜索代码在 /var/Widget/Archive.php 1185行

$select->where('table.contents.password IS NULL')
->where('table.contents.title LIKE ? OR table.contents.text LIKE ?', $searchQuery, $searchQuery)
->where('table.contents.type = ?', 'post');

看了看发现没有问题,用的是Like,判断标题或内容包含。
type字段是文章类型,独立页面是page,文章是post,所以这里使用post没问题。
那问题就只可能出在第一行table.contents.password IS NULL

只搜索密码为空的内容,很合理,我就想,是不是null和空字符串傻傻分不清呢?
我就用Navicat打开了数据库文件看了看

Typecho迁移到SQLite后,搜索不到内容的坑

果然,password 字段有的是NULL,有的是空字符串。应该是 MySQL转 SQLite 之后,把这个字段的默认值改成了NULL而不是空字符串,那么解决方案就有了

第一行后面加上个OR table.contents.password = ""就行了

$select->where('table.contents.password IS NULL OR table.contents.password = ""')
->where('table.contents.title LIKE ? OR table.contents.text LIKE ?', $searchQuery, $searchQuery)
->where('table.contents.type = ?', 'post');

另外想了个解决方法,就是把空值的默认改回空字符串,而不是NULL,但数据库不太懂(笑

标签: typecho, sqlite

添加新评论