【问题标题】:MySql search to ignore punctuation, symbols and spaces while data in db has special charactorsMySql 搜索忽略标点符号和空格,而 db 中的数据具有特殊字符
【发布时间】:2012-09-22 15:45:26
【问题描述】:

我有一个巨大的 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) 在任何情况下我们都应该能够显示结果..

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

【问题讨论】:

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


    【解决方案1】:

    这是另一个解决方案:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 我尝试过 REGEXP,但未能成功满足我的标准。我的标准如下 a) 用户可以使用或不使用特殊字符进行搜索 b) part_number 字段中的数据可能在任何地方包含也可能不包含特殊字符
          • 如果您不打算尝试解决所提出的具体问题,那么将 mysql 文档的链接作为评论放在问题下方似乎比回答更明智。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          相关资源
          最近更新 更多