【问题标题】:is possible to have accent sensitive and case insensitive utf8 collation in mysql?在 mysql 中是否可以有区分重音和不区分大小写的 utf8 排序规则?
【发布时间】:2011-11-28 08:19:15
【问题描述】:

如何在 mysql 中执行区分重音但不区分大小写的 utf8 搜索? utf8_bin 区分大小写,utf8_general_ci 不区分重音。

【问题讨论】:

  • 不是今天...但是,如果您想折叠大小写,但需要区分重音,请通过bugs.mysql.com 提出请求。

标签: mysql utf-8 character-encoding collation


【解决方案1】:

如果您想将“cafe”与“cafe”区分开来 您可以使用:

Select word from table_words WHERE Hex(word) LIKE Hex("café");

这样它会返回 'café'。

否则,如果您使用:

Select word from table_words WHERE Hex(word) LIKE Hex("cafe");

它将返回咖啡馆。 我正在使用 latin1_german2_ci 排序规则。

【讨论】:

    【解决方案2】:

    似乎没有,因为case sensitivity is tough to do in Unicode

    有一个utf8_general_cs 排序规则,但它似乎是实验性的,并且根据this bug report 的说法,在使用 LIKE 时并没有达到预期的效果。

    如果您的数据仅包含西方变音符号(即 ISO-8859-1 中包含的变音符号),您也许可以将您的搜索操作整理到 latin1_german2_ci 或使用它创建一个单独的搜索列(特定于根据this page,排序规则对重音敏感;latin1_general_ci 可能也是如此,我不知道,现在无法测试)。

    【讨论】:

      【解决方案3】:

      您可以使用“hex”使搜索区分重音。然后只需添加 lcase 使其再次不区分大小写。所以这会给:

      SELECT name FROM people WHERE HEX(LCASE(name)) = HEX(LCASE("René"))
      

      您确实会像这样将所有索引都扔出窗口。如果您想避免进行全表扫描并且您在“名称”上有索引,也可以搜索不带十六进制和 lcase 的相同内容:

      SELECT name FROM people WHERE name = "René" and HEX(LCASE(name)) = HEX(LCASE("René"))
      

      这样,“name”上的索引将用于仅查找“René”和“Rene”行,然后只需对这些行进行与“hex”的比较两行而不是完整的表。

      【讨论】:

      • 如果您想要大小写折叠,但需要区分重音,请通过bugs.mysql.com 提出请求。
      猜你喜欢
      • 2011-06-01
      • 2019-06-19
      • 2011-11-14
      • 2011-05-23
      • 2012-06-15
      • 1970-01-01
      • 2012-07-01
      • 2016-12-19
      相关资源
      最近更新 更多