如何在 MySql 中进行重音敏感的搜索

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

阿巴德
回去吧

我使用的查询如下:

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

查询结果给出了以下两个词:

阿巴德
回去吧

有没有一种方法可以表明我只希望 MySQL 找到重音字?我希望查询只返回

回去吧

我也试过这个问题:

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

没有结果,谢谢你的帮助。

71177 次浏览
SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS

(或你的校对资料,包括「 cs 」)

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

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

col_name varchar(10) collate utf8_bin

如果搜索通常对重音不敏感,但希望对此搜索进行异常处理,请尝试;

WHERE col_name = 'abád' collate utf8_bin

MySQL 8.0的更新,以及一些评论和其他答案:

  • CHARACTER SETCOLLATION的开头匹配。
  • 任何以 _bin结尾的 COLLATION名称都会忽略大小写和重音符号。
  • 任何包含 _as_COLLATION名称都会忽略重音,但是是否折叠大小写是基于 _ci_cs
  • 要查看可用的排序规则(在任何版本上) ,请执行 SHOW COLLATION;
  • utf8mb4现在是默认字符集。您应该使用它而不是 utf8
  • 比起动态地使用任何转换例程(如 CONVERT()) ,在每个列上“正确地”设置 CHARACTER SETCOLLATION(或表定义中的默认设置)更好。

那么,您刚刚描述了 utf8 _ general _ ci 排序规则的全部内容(a,á,à,â,ä,å all 等于 a)。

MySQL 服务器5.1在 utf8 _ general _ ci 和 utf8 _ unicode _ ci 方面也发生了变化,因此它也依赖于服务器版本。最好查一下文件。

因此,如果是 MySQL server 5.0,我会选择 utf8 _ unicode _ ci 而不是 utf8 _ general _ ci,这显然不适合您的用例。

在我的版本(MySql 5.0)中,没有任何 utf8字符集校对可用于大小写不敏感、重音不敏感的搜索。Utf8的唯一重音敏感校对是 utf8 _ bin。但是它也是区分大小写的。

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

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

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

我得到了同样的错误。

我已经将表的排序规则更改为 utf8 _ bin (通过 phpMyAdmin) ,问题就解决了。

检查数据库表排序类型是否以“ _ ci”结尾,这表示不区分大小写..。

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

例如... 将“ utf8 _ general _ ci”更改为“ utf8 _ bin” 麦克

接受的答案是好的,但请注意,您可能必须使用 COLLATE utf8mb4 _ bin 代替!

WHERE col_name = 'abád' collate utf8mb4_bin

以上修正了以下错误:

MySQL 说: 文档1253-COLLATION‘ utf8 _ bin’对 字符集‘ utf8mb4’

对于在 utf8 _ general _ ci 数据库中的 MySql 服务器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

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