MySql搜索忽略标点符号,符号和空格,而db中的数据具有特殊字符

时间:2012-10-01 18:56:58

标签: php mysql search full-text-search replace

我有一个巨大的innoDB库存表,超过4000万条记录,使用csv文件(每次超过100万个数据的文件)不断更新。我们使用Load Data Infile方法将数据导入表中。

该表有一个名为part_number的文件,它是每个库存项目的唯一标识符。此字段中的数据包含一个或多个特殊字符,如“ - ”,“_”,“#”,“$”,“”等。

例如。 ABCD-1234

我们有一个设施供最终用户使用part_number作为关键字搜索此表。 有三种类型的搜索 a)完全匹配 b)包含 c)从

开始

我的要求是向用户显示具有特殊字符的结果,即使他们搜索时没有“ - ”,“_”,“#”,“$”,“”等字符。

例如。用户应该能够搜索Abcd1234并获得结果Abcd-1234。     用户应该能够搜索Abcd-1234并获得结果Abcd1234     用户应该能够搜索Abcd_1234并获得结果Abcd1234和Abcd-1234

注意:为了避免在插入过程中出现表锁定以及其他一些依赖项,我不得不将表格保留为InnoDB

添加一个存储part_number的新列,省略标点符号并对该字段运行搜索是我想到的解决方案,但它会影响数据导入过程,这是不可接受的。

我曾尝试过REGEXP,但没有成功达到我的标准。我的标准如下 a)用户可以使用或不使用特殊字符进行搜索 b)part_number字段中的数据可能包含也可能不包含任何特殊字符 c)我们应该能够在任何情况下显示结果..

如果有办法解决这个问题,请告诉我。

4 个答案:

答案 0 :(得分:3)

请试试这个,它会帮助你 Select REPLACE(cname, '-', '') as cna From country HAVING cna LIKE '%APRE29192%'

答案 1 :(得分:0)

也许您可以查看REGEXP并制作一个符合您需求的正则表达式:http://dev.mysql.com/doc/refman/5.1/en/regexp.html

答案 2 :(得分:0)

其中一个解决方案是使用 MySql TABLE VIEW ,您可以在其中搜索包含字母数字 part_number 标记的列。

答案 3 :(得分:0)

这是另一种解决方案:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(cname, '-', ''), '.', ''), '\'', ''), ' ', '') 
AS cna FROM country HAVING cna LIKE   
CONCAT(CONCAT('%',REPLACE(REPLACE(REPLACE(REPLACE('$search_term', '-', ''), '.', ''), '\'', ''), ' ', '')),'%')