You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:57:03