我的 spamassassin 设置非常旧,并且已经迁移到两台机器和多个 mysql 重新安装。我最近注意到,sa-learn
在消息上运行时,我的日志中会出现大量错误,如下所示:
bayes: _put_token: SQL error: Incorrect string value: '\x8A\x98s\x9A\xC8' for column 'token' at row 1
我检查了数据库并进行了一些研究,发现这个非常古老的错误报告指出了这个问题:我的架构(非常!)过时了。该列bayes_token.token
是CHAR(5)
排序规则 utf8_general_ci,截至 9 年前,应该是BINARY(5)
.
我不能简单地转换列类型,因为许多 UTF8 5-char 值长于 5 个字节(表有 ~110K 行)。
我的问题是:是否有任何方法可以截断过长的标记,使它们在贝叶斯分类器中保持有效?或者如果失败了,我可以只删除那些行,以便我可以将其余部分转换为二进制?
更新:我确实设法将列内容传输到BINARY(5)
表中的一个添加列(这里命名为token2
),如下所示:
UPDATE bayes_token SET token2 = CONVERT(token USING latin1);
这与我所能想到的“退回”插入时令牌发生的事情一样接近。但是,结果列中有许多重复项,并且由于该token
列是主键的一部分,这不好。
我认为数据可以保存,但可能不是纯 SQL。我需要:
- 从最新模式创建空表的新副本
- 对每个标记的所有重复项进行分组,并将这些行的值
ham_count
和spam_count
最大值相加atime
- 将这些聚合结果插入到新表中
- 用新表替换原来的表