Mysql 忽略搜索查询中的特殊字符

Mysql 忽略搜索查询中的特殊字符,mysql,escaping,Mysql,Escaping,几天来,我一直绞尽脑汁想找到解决办法。我正在尝试做一个“智能”查询,可以处理范围广泛的搜索词。查询运行良好,直到涉及到特殊字符,并且我已经在某些字符(如逗号和破折号)上使用REPLACE方法取得了一些成功。其他字符(如引号和符号)将导致空查询 这里有几个例子: 我正在搜索的原始名称是“法语很有趣,书1-1年选项”,通过下面的查询,我得到了返回的搜索结果: 1. "French Is Fun" 2. "French Is Fun, book" 3. "French Is Fun, book"

几天来,我一直绞尽脑汁想找到解决办法。我正在尝试做一个“智能”查询,可以处理范围广泛的搜索词。查询运行良好,直到涉及到特殊字符,并且我已经在某些字符(如逗号和破折号)上使用REPLACE方法取得了一些成功。其他字符(如引号和符号)将导致空查询

这里有几个例子:

我正在搜索的原始名称是“法语很有趣,书1-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"
然而,当原始标题中有一个符号,如:“全球历史与地理:文明的增长-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表的同步需要更多的管理工作,但是全文非常好。