【问题标题】:Accent insensitive search in InnoDB MySQL table!InnoDB MySQL 表中的重音不敏感搜索!
【发布时间】:2011-04-06 10:00:52
【问题描述】:

我正在编写一个简单的搜索脚本,它可以查看特定表格的两列。本质上,我正在寻找公司编号或名称之间的匹配项。我在 SQL 中使用 LIKE 语句,因为我使用的是 InnoDB 表(这意味着没有全文搜索)。

问题是我在双语环境(法语和英语)中工作,法语中的一些字符有口音。我希望重音字符被视为与非重音字符相同,换句话说,é = e、e = é、à = a 等。SO 有很多与该问题有关的问题,但似乎没有一个有效对我来说。

这是我的 SQL 语句:

SELECT id, name FROM clients WHERE id LIKE '%éc%' OR name LIKE '%éc%';

我想找到“école”和“ecole”,但它只能找到“école”。

我还要注意,我的表都是utf8_general_ci。

帮助我 StackOverflow,你是我唯一的希望! :)

【问题讨论】:

    标签: php mysql diacritics collation


    【解决方案1】:

    您也许应该考虑将问题字符转换为对应的英文字符,然后将它们存储在不同的列中,可能称为 searchable 或类似名称。每当您的主列更新时,您当然需要更新它。

    然后您将有两列,一列包含重音字符,另一列包含纯英文可搜索内容。

    【讨论】:

    • 我不确定我是否愿意处理冗余数据,尤其是因为我最终可能会在内容远大于名称和标识符的其他地方使用此解决方案。我知道在 PHP 中有一些方法可以做到这一点,所以如果没有解决方案用 MySQL 做到这一点,我会感到惊讶。
    【解决方案2】:

    我将为你提供另一个答案。

    我刚刚读到utf8_general_ci 不区分重音,所以你应该没问题。

    一种解决方案是使用

     mysql_query("SET NAMES 'utf8'"); 
    

    这告诉客户端发送 SQL 语句的字符集。

    另一种解决方案似乎是使用 MySQL 的 HEX() 函数将重音字符转换为其十六进制值。但我找不到任何很好的例子,在阅读了HEX() 的 MySQL 文档之后,它看起来可能不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多