Mysql 忽略搜索查询中的特殊字符
几天来,我一直绞尽脑汁想找到解决办法。我正在尝试做一个“智能”查询,可以处理范围广泛的搜索词。查询运行良好,直到涉及到特殊字符,并且我已经在某些字符(如逗号和破折号)上使用REPLACE方法取得了一些成功。其他字符(如引号和符号)将导致空查询 这里有几个例子: 我正在搜索的原始名称是“法语很有趣,书1-1年选项”,通过下面的查询,我得到了返回的搜索结果:Mysql 忽略搜索查询中的特殊字符,mysql,escaping,Mysql,Escaping,几天来,我一直绞尽脑汁想找到解决办法。我正在尝试做一个“智能”查询,可以处理范围广泛的搜索词。查询运行良好,直到涉及到特殊字符,并且我已经在某些字符(如逗号和破折号)上使用REPLACE方法取得了一些成功。其他字符(如引号和符号)将导致空查询 这里有几个例子: 我正在搜索的原始名称是“法语很有趣,书1-1年选项”,通过下面的查询,我得到了返回的搜索结果: 1. "French Is Fun" 2. "French Is Fun, book" 3. "French Is Fun, book"
1. "French Is Fun"
2. "French Is Fun, book"
3. "French Is Fun, book"
4. "French Is Fun, Book 1"
SELECT * FROM `products` WHERE ( (LOWER(name) LIKE '%french is fun book%' OR
LOWER(replace(name, ' ','')) LIKE '%french is fun book%' OR
LOWER(replace(name, ' ','')) LIKE '%french is fun book%' OR
LOWER(replace(name, '-','')) LIKE '%french is fun book%')
1. "Global History & Geography"
2. "Global History Geography"
然而,当原始标题中有一个符号,如:“全球历史与地理:文明的增长-1年选项”时,当我尝试这些不同的搜索词时,我会得到一个空查询:
1. "French Is Fun"
2. "French Is Fun, book"
3. "French Is Fun, book"
4. "French Is Fun, Book 1"
SELECT * FROM `products` WHERE ( (LOWER(name) LIKE '%french is fun book%' OR
LOWER(replace(name, ' ','')) LIKE '%french is fun book%' OR
LOWER(replace(name, ' ','')) LIKE '%french is fun book%' OR
LOWER(replace(name, '-','')) LIKE '%french is fun book%')
1. "Global History & Geography"
2. "Global History Geography"
我试过这个也没用
SELECT * FROM `products` WHERE
(LOWER(name) LIKE '%global history geograph%' OR
LOWER(replace(name, ' ','')) LIKE '%global history geography%' OR
LOWER(replace(name, ' ','')) LIKE '%global history geography%' OR
LOWER(replace(name, ',','')) LIKE '%global history geography%' OR
LOWER(replace(name, '&','')) LIKE '%global history geography%' OR
LOWER(replace(name, '-','')) LIKE '%global history geography%');
我还尝试在符号中添加转义字符,但没有帮助:
SELECT * FROM `products` WHERE
(LOWER(name) LIKE '%global history geography%' OR
LOWER(replace(name, ' ','')) LIKE '%global history geography%' OR
LOWER(replace(name, ' ','')) LIKE '%global history geography%' OR
LOWER(replace(name, ',','')) LIKE '%global history geography%' OR
LOWER(replace(name, '\&','')) LIKE '%global history geography%' OR
LOWER(replace(name, '-','')) LIKE '%global history geography%');
名称中的逗号也返回空结果。作为演示,原始名称如下:
“Amsco的AP微积分AB/BC准备高级入学考试-1年选项”
此尝试始终返回空查询:
SELECT * FROM `products` WHERE
( (LOWER(name) LIKE '%amscos ap calculus%' OR
LOWER(replace(name, ' ','')) LIKE '%amscos ap calculus%' OR
LOWER(replace(name, '\'','')) LIKE '%amscos ap calculus%' OR
LOWER(replace(name, ',','')) LIKE '%amscos ap calculus%' OR
LOWER(replace(name, '-','')) LIKE '%amscos ap calculus%')
) AND ( (`products`.`type` = 'Rental' ) );
有什么想法吗?按照您的方式,您将让您的DB服务器反复执行相同的工作,直到它因资源耗尽而死亡 短版: 向表中添加另一列,该列包含已去掉特殊字符和小写字母的标题。基于此进行选择 中等版本: 使用 长版本
创建一个单独的表结构,用于跟踪单个单词及其与各种标题的关联,并创建查询/程序逻辑以进行搜索。您可以尝试以下方法:
SELECT part_no, nomenclature FROM store_info WHERE
REPLACE(
REPLACE(
REPLACE(part_no,'/',''),'-',''),'.',''
) LIKE '%LWR0492%'
在我看来,你的整个方法不是那么好。搜索“全球地理与历史”怎么样?你最好将你的查询分开,并利用全文搜索,例如,使用
MATCH()…对…
短版本可能有效,中版本是不行的,因为我们使用的是mysql 5.5,不打算升级,而长版本在我分配的时间内会有太多的工作要做。所以,现在看看简短的版本。嗯。。。从v3 IIRC的某个地方开始,全文就已经可用了。唯一的要求是表类型为myISAM。是的-我已经考虑过将表类型更改为myISAM的想法,现在我们没有办法这样做。您可以创建一个单独的、全文索引的myISAM表,其中只有标题和一个指向产品的键。保持它与innoDB表的同步需要更多的管理工作,但是全文非常好。