以度数符号存储,无需 php SQL LIKE 语句即可搜索

stored with degree symbol, be able to search without, php SQL LIKE statement

我构建的搜索功能有点问题。

我在 mysql table 中有一列名为:标题 (utf8_swedish_ci)

这是大约 20.000 个标题中的 2 个标题:

50° Riesling Réserve Trocken  
50° Parallel Riesling Trocken

有什么办法可以让用户搜索没有度数符号的 50 Riesling 或 50 Parallel 吗?

我的代码:

$search = str_replace("\'","’", $_GET['searchString']);
$search = htmlentities($search);
$search = esc_sql($search);
$search = trim($search);
if(!empty($_GET["searchString"])){
    $str .= "`title` LIKE '%".$search."%' AND ";
}

SQL 声明(部分,关于此):

$res = $wpdb->get_results("SELECT * FROM searchtbl WHERE ".$str." ORDER BY ".$sortby." ".$sort." LIMIT 500");

作为一个额外的问题: 是否有一些 "easy" 方法可以让用户能够搜索 50 Riesling 并找到这两个项目? (它与很多标题相关,而不仅仅是这两个)

您可以使用 REPLACE() 从要与输入字符串进行比较的列中删除度数符号:

SELECT *
FROM searchtbl
WHERE REPLACE(title, '°', '') LIKE '50 Riesling'

如果您还有其他有问题的字符,您可以尝试类似的方法。我省略了 PHP 代码,但我会把它留给你作为练习。

您有多个选项,您甚至可以组合这些选项以获得所需的输出。

  1. 在 table 中创建另一个字段,在其中存储没有任何特殊字符的标题,例如 ° 和 运行 两列的搜索或者你也从 seraches 中删除特殊字符。如果您有 mysql v5.7.6 或更高版本,那么使用生成的列是一个理想的解决方案。

  2. 您可以在 where 条件中搜索时删除这些特殊字符 'on the fly'。同样,生成的列可能是一个更快的解决方案。

  3. 使用全文索引和搜索。但是,您需要将默认的最小字长减少到 2,并且您可能还需要处理整理文件。 This SO topic 包含更多相关信息。

  4. 您可以将搜索字符串拆分为 php 中的单词,例如使用 explode() 和 serach 搜索不在单个搜索条件中的单词,而是在单独的搜索条件中。

后两种方法的优点是,如果以 50 雷司令为搜索条件,它们会找到这两条记录。