如何在SQL中用不带撇号的关键词查询包含带撇号内容的记录
你原来的查询返回空,是因为LIKE为逐字符精确匹配,worlds和带撇号的world's字符序列不一致,因此无法命中。可以通过以下几种方案实现需求:
方案1:查询时动态移除撇号匹配(适合小数据量场景)
直接在查询时对字段和搜索词统一做撇号移除处理后再匹配,不需要修改表结构,实现最简单:
$search = "worlds"; // 预处理搜索词,移除所有撇号 $processedSearch = str_replace("'", "", $search);
对应的SQL语句(注意使用参数绑定,避免SQL注入):
SELECT * FROM product WHERE REPLACE(name, '\'', '') LIKE CONCAT('%', ?, '%');
优缺点:实现成本极低,适合数据量小于10万的表;缺点是查询时需要全表扫描做字段替换,无法用到普通索引,数据量大时性能很差。
方案2:新增预处理索引字段(适合中大数据量、高频查询场景)
新增一个专门用于搜索的标准化字段,写入数据时提前把撇号、大小写等统一处理后存入,给该字段加索引后查询性能很高:
-- 新增标准化搜索字段 ALTER TABLE product ADD COLUMN name_normalized VARCHAR(255) COMMENT '标准化后的搜索名称'; -- 初始化存量数据,这里同时做了小写处理,也支持不区分大小写搜索 UPDATE product SET name_normalized = LOWER(REPLACE(name, '\'', '')); -- 加索引提升查询性能 CREATE INDEX idx_name_normalized ON product(name_normalized);
查询时直接使用标准化字段:
SELECT * FROM product WHERE name_normalized LIKE CONCAT('%', LOWER(?), '%');
优缺点:查询性能好,后续还可以扩展支持其他特殊字符(如连字符、重音符号等)的统一处理;缺点是需要额外占用存储空间,写入数据时需要同步维护这个字段。
方案3:使用数据库全文搜索(适合复杂搜索需求场景)
如果使用的是MySQL、PostgreSQL这类支持全文搜索的数据库,可以给name字段建全文索引,配置全文解析器忽略撇号,搜索时worlds和world's会被识别为同一个词根,搜索性能和匹配灵活度都很高,还支持按匹配度排序。
MySQL配置示例:
-- 建全文索引 ALTER TABLE product ADD FULLTEXT INDEX ft_idx_name(name); -- 搜索时自动匹配带撇号的变体 SELECT * FROM product WHERE MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE);
内容的提问来源于stack exchange,提问作者DevSG
相关产品推荐
相关产品推荐

