返回了不正确的搜索记录

2ic8powd  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(249)

我对mysql在列中搜索文本的方式有一个问题。我有一个文本字符串要搜索,但是db返回了不同的字符串变体,特别是忽略了列数据中的连字符。举个例子:
搜索“%800fm%”及其返回的字符串为“800f-m”的数据我只想返回与搜索的字符串匹配的数据(即在这种情况下,不要忽略列值中的连字符)
我尝试了以下查询,但仍然使用连字符获取记录:

SELECT p.partNo,
       p.stripedPartNo,
       p.ID AS partId,
       m.manufacturerName,
       concat(m.manufacturerName, ' ', p.partNo) AS fullPartName,
       1 AS `order`
FROM parts p
JOIN manufacturers m ON m.ID = p.manufacturerID
JOIN partSearchCache pc ON pc.partID = p.id
WHERE MATCH (pc.partName) AGAINST ('800FM')
  AND p.managerApproved = 1
LIMIT 100

SELECT p.partNo,
           p.stripedPartNo,
           p.ID AS partId,
           m.manufacturerName,
           concat(m.manufacturerName, ' ', p.partNo) AS fullPartName,
           1 AS `order`
    FROM parts p
    JOIN manufacturers m ON m.ID = p.manufacturerID
    JOIN partSearchCache pc ON pc.partID = p.id
    WHERE MATCH (pc.partName) AGAINST ('%800FM%')
      AND p.managerApproved = 1
    LIMIT 100

SELECT p.partNo,
       p.stripedPartNo,
       p.ID AS partId,
       m.manufacturerName,
       concat(m.manufacturerName, ' ', p.partNo) AS fullPartName,
       1 AS `order`
FROM parts p
JOIN manufacturers m ON m.ID = p.manufacturerID
JOIN partSearchCache pc ON pc.partID = p.id
WHERE pc.partName LIKE '%800FM%'
  AND p.managerApproved = 1
LIMIT 100

我在pc.partname列上启用了全文索引,但仍然没有得到所需的结果。
我意识到和对手的比赛在我缩进的时候是行不通的,但我想我应该用这些例子来展示我正在努力实现的目标。
有什么想法吗?

htrmnn0y

htrmnn0y1#

如果你能给我们看看你的后台会很有用的。你可能应该用二进制。二进制使用位比较。
用法:

SELECT * 
FROM people 
WHERE name LIKE BINARY '%abc%' ;

这也将强制区分大小写,这更准确。
请参见链接:https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html
如果没有帮助,给我看看你的数据,我也许可以重写一个更一致的查询。

相关问题