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

时间:2009-02-01 13:42:49

标签: mysql utf-8

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

阿巴德
ABAD

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

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

查询结果给出了两个单词:

阿巴德
ABAD

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

abád

我也试过这个问题:

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

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

10 个答案:

答案 0 :(得分:81)

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

col_name varchar(10) collate utf8_bin

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

WHERE col_name = 'abád' collate utf8_bin

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

我遇到了同样的错误。

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

希望它有所帮助! :)

答案 4 :(得分:1)

检查数据库表排序规则类型是否以" _ci"结尾,这表示不区分大小写......

将其更改为整理相同或最近的名称,而不使用" _ci" ...

例如......更改" utf8_general_ci" to" utf8_bin" MKE

答案 5 :(得分:0)

SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS 

(或您的校对包括cs)

答案 6 :(得分:0)

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

答案 7 :(得分:0)

嗯,你刚才描述了utf8_general_ci整理的全部内容(a,á,à,â,ä,å都等于a)。

对于utf8_general_ci和utf8_unicode_ci,MySQL服务器5.1也有变化,因此它也依赖于服务器版本。更好地检查文档。

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

答案 8 :(得分:0)

接受的答案很好,但要注意你可能不得不使用COLLATE utf8mb4_bin!

WHERE col_name = 'abád' collate utf8mb4_bin

上面修复了以下错误:

  

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

答案 9 :(得分:0)

对于我来说,在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

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