【问题标题】:How to conduct an Accent Sensitive search in MySql如何在 MySql 中进行口音敏感搜索
【发布时间】:2021-11-03 17:16:20
【问题描述】:

我有一个带有 utf8 通用 ci 排序规则的 MySQL 表。在表格中,我可以看到两个条目:

阿巴德
阿巴德

我正在使用如下所示的查询:

SELECT *  FROM `words` WHERE `word` = 'abád'

查询结果给出两个词:

阿巴德
阿巴德

有没有办法表明我只想让 MySQL 找到重音词?我希望查询只返回

阿巴德

我也试过这个查询:

SELECT *  FROM `words` WHERE BINARY `word` = 'abád'

它没有给我任何结果。谢谢你的帮助。

【问题讨论】:

    标签: mysql utf-8


    【解决方案1】:
    SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS 
    

    (或您的排序规则,包括 cs)

    【讨论】:

      【解决方案2】:

      您可以尝试在 mysql 中搜索字符的十六进制变量 HEX() 并在您的编程语言中使用类似的函数并匹配它们。当我在做一个可以选择一个人的第一个字母的列表时,这对我很有效。

      【讨论】:

        【解决方案3】:

        如果您对该字段的搜索总是区分重音,则将该字段的排序规则声明为 utf8_bin(这将比较 utf8 编码的字节是否相等)或使用特定于语言的排序规则来区分重音和非重音字符。

        col_name varchar(10) collate utf8_bin
        

        如果搜索通常不区分重音,但您想为此搜索设置例外,请尝试;

        WHERE col_name = 'abád' collate utf8_bin
        

        【讨论】:

        • 感谢您的建议,但我得到:“COLLATION 'utf8_bin' is not valid for CHARACTER SET 'latin1'”。
        • 顺便说一句,我的字符集真的是“utf8_general_ci”,所以我不知道为什么它说字符集是“latin1”。
        • @OMA 查找字符集并整理数据库、表和列,都应该相同才能正常工作
        • 这也适用于 ... WHERE CONVERT(field_name USING latin1) like '%á%' COLLATE utf8_bin 的 LIKE 通配符运算符
        • @User 尝试改用collate utf8mb4_bin
        【解决方案4】:

        嗯,您刚刚描述了 utf8_general_ci 排序规则的全部内容(a、á、à、â、ä、å 在比较中都等于 a)。

        在 utf8_general_ci 和 utf8_unicode_ci 方面,MySQL 服务器 5.1 也发生了变化,因此它也取决于服务器版本。最好查看文档。

        所以,如果是 MySQL 服务器 5.0,我会选择 utf8_unicode_ci 而不是 utf8_general_ci,这对于您的用例来说显然是错误的。

        【讨论】:

          【解决方案5】:

          在我的版本(MySql 5.0)中,没有任何 utf8 字符集可用于不区分大小写、区分重音的搜索。 utf8 唯一区分重音的排序规则是 utf8_bin。但是它也区分大小写。

          我的工作是使用这样的东西:

          SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
          

          【讨论】:

          • #1253 - COLLATION 'utf8_bin' is not valid for CHARACTER SET 'utf8mb4'
          • 那你应该使用utf8mb4_bin。
          • 如果你想让它不区分大小写,别忘了LOWER('the_searched_value') 这样你会得到LOWER(column) = LOWER('aBád')
          • 我还必须使用 utf8mb4_bin...这是用于 phpMyAdmin 中的“内联查询”。想知道这些 CHARACTER SET 设置在哪里以及为什么设置...?
          【解决方案6】:

          MySQL 错误是http://bugs.mysql.com/bug.php?id=19567,供将来参考。

          【讨论】:

            【解决方案7】:

            我遇到了同样的错误。

            我已将表格的排序规则更改为 utf8_bin(通过 phpMyAdmin),问题已解决。

            【讨论】:

              【解决方案8】:

              查看数据库表排序规则类型是否以“_ci”结尾,这个代表不区分大小写...

              将其更改为不带“_ci”的相同或最接近名称的排序规则...

              例如...将“utf8_general_ci”更改为“utf8_bin” 马克

              【讨论】:

                【解决方案9】:

                接受的答案很好,但请注意,您可能必须改用 COLLATE utf8mb4_bin!

                WHERE col_name = 'abád' collate utf8mb4_bin
                

                以上修复了以下错误:

                MySQL 说:文档 1253 - COLLATION 'utf8_bin' 无效 字符集'utf8mb4'

                【讨论】:

                  【解决方案10】:

                  这适用于我在 utf8_general_ci 中的数据库中的 MySql server 5.1 中不区分重音和不区分大小写的搜索,其中列是 LONGBLOB。

                  select * from words where '%word%' LIKE column collate utf8_unicode_ci
                  

                  select * from words where'%word%' LIKE column collate utf8_general_ci
                  

                  结果区分大小写,但不区分重音。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-02-12
                    • 1970-01-01
                    • 2011-11-29
                    • 1970-01-01
                    • 2019-03-21
                    • 1970-01-01
                    • 2012-09-07
                    相关资源
                    最近更新 更多