用词库检查用户名是否含某个词时,INSTR的第一个参数是待检查文本,第二个才是每行关键词;它返回位置,不是返回匹配后的字符串。
先用一个小例子确认方向
SELECT INSTR('abcd', 'b');
SELECT INSTR('abcd', 'x');
按函数规则,第一条位置为2,第二条未找到为0;位置从1开始。如果任一参数是NULL,结果为NULL,不应把它当成普通不命中的0。MySQL INSTR说明
表提供关键词列,不是把整张表当参数
假设示例词库为keyword_list,关键词列为keyword,查询可写成:
SELECT keyword
FROM keyword_list
WHERE keyword IS NOT NULL
AND keyword <> ''
AND INSTR(?, keyword) > 0;
?由驱动绑定待检查用户名,不能拼接进SQL。示例名称不是原项目表结构。原记录里 form 应为 FROM,第二个参数所指也是某一列的值,不是表对象。
这里显式排除空词条,避免空子串产生无意义命中。输入用户名本身的null、长度和空白规范,应在接口层按业务规则处理;有多个命中词时,也要明确返回全部、只需判断存在还是执行其他动作。
字面包含不等于完整审核
这段查询只检查子串,无法保证覆盖变体、分隔、谐音等情况。大小写、二进制参数、字符集及实际比较行为需要按数据库与输入契约验证,不以一个英文算例推导所有中文规则。
词库变大后,也应查看实际执行成本;对每行关键词计算函数,不能想当然认为有普通索引就会很快。
可准备首位、中间、多次命中、不命中、null和空词条样本,记录预期业务行为。规则正确性与性能分别评估,不把“查到了关键词”直接称为完成内容审核。