Mysql utf8\u general\u ci排序规则不区分重音的搜索/问题

Mysql utf8\u general\u ci排序规则不区分重音的搜索/问题,mysql,sql,utf-8,full-text-search,diacritics,Mysql,Sql,Utf 8,Full Text Search,Diacritics,编辑:如果您在这里是因为对MySQL中的波兰语排序规则感到困惑 我正在尝试对波兰城市表进行全文搜索,其中许多城市都包含重音字符。它的目的是在自动完成的ajax调用中使用,因此如果搜索不区分重音就更好了。我已将行的排序规则设置为ut8\u polish\u ci。现在,考虑到城市Zelów,我像这样查询数据库 从Cities中选择*将city与zelow匹配 但是没有用。Mysql返回一个空结果。我尝试了不同的口音,尝试向查询添加不同的排序规则,但没有任何帮助。我不确定该如何处理这个问题,因为口音

编辑:如果您在这里是因为对MySQL中的波兰语排序规则感到困惑

我正在尝试对波兰城市表进行全文搜索,其中许多城市都包含重音字符。它的目的是在自动完成的ajax调用中使用,因此如果搜索不区分重音就更好了。我已将行的排序规则设置为ut8\u polish\u ci。现在,考虑到城市Zelów,我像这样查询数据库

从Cities中选择*将city与zelow匹配

但是没有用。Mysql返回一个空结果。我尝试了不同的口音,尝试向查询添加不同的排序规则,但没有任何帮助。我不确定该如何处理这个问题,因为口音敏感度似乎没有很好的记录。有什么想法吗

编辑

所以我发现不区分大小写的全文搜索只在布尔模式下执行,因此正确的查询应该是

选择*fromcities,其中以布尔模式将城市与zelow匹配

以前我以为是因为。可能还有更多,但我现在真的很困惑

无论如何,正如在下面的评论中提到的,我在cities列上有唯一的索引,所以将表的排序规则更改为不区分重音的utf8\u general\u ci是不可能的

但是,我意识到以下查询在具有utf8\u polish\u ci排序规则的表上运行得非常好:

从城市中选择*,城市如“zelow”校对utf8\u general\u ci

现在看来,最合理的解决方案是以类似的方式进行全文搜索:

选择*fromcities,其中在布尔模式下将城市与“zelow”匹配,并将utf8\u genral\u ci

但是,这会产生以下错误:

1253-排序规则“utf8\u general\u ci”对字符集“binary”无效

这真的开始让我心烦了。不妨放弃全文搜索,转而采用简单的where-like方法,但在一个有近50k条记录的表中,这似乎不明智,因为这些记录将被密集查询

最后编辑 好吧,布尔模式部分是胡说八道。只是部分原因是,正如我所说的,它确实可以在utf8\u general\u ci上工作,但它的工作方式正好相反。我完全困惑,没有意愿进一步研究这个问题。我决定放弃这个独特的索引,反正不会再添加任何城市,所以不需要对它做太大的改动,而是坚持utf8\u general\u ci表排序规则。我感谢所有的帮助,它指引了我正确的方向。

如果您尝试:

select * from cities where cityname like 'zelow'

将排序规则更改为utf\u general\u ci。它在搜索和排序时忽略重音,但仍然正确存储重音

MySQL在编码/排序方面非常灵活,可能太灵活了。更改编码/排序规则时,请确保正在转换表,而不仅仅是更改编码/排序规则类型

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
您还可以转换单个字段,以便表的排序规则设置为utf8\U general\U ci,但您可以更改一个或多个字段,以便它们使用其他排序规则。根据您看到的二进制错误,您的文本字段可能具有UTF8-BIN排序规则或是blob。你能发布创建表格的结果吗

请记住,字符集编码是数据的存储方式,排序规则是数据的索引方式。并非所有的组合都有效

我最初的问题可能会有所帮助:
将排序规则从二进制更改为utf8\u-bin。utf8\u-bin应该与utf8\u-general\u-ci兼容,但仍然允许您以不同的口音存储城市名称。

按照Vache说的做。。。我检查了我的数据库,排序规则是utf_general_ci。问题是,存储城市名称的列有一个唯一的键。像奥斯特罗维克和奥斯特罗维克这样完全不同的城市呢?如果我将排序规则更改为utf8_general_ci,mysql会抱怨此列中存在重复条目。因此,我希望在表中保留当前排序规则,但只执行不区分重音的搜索。我尝试在查询结束时添加COLLATE utf8_general_ci,但mysql表示1253-COLLATE'utf8_general_ci'对字符集'binary'无效,请查看是否可以帮助您。谢谢,但我已经在谷歌上搜索到了:。关于更新,请参阅原始帖子。我们谈论的是稍微不同的事情。我希望我的表是utf8_polish_ci,以确保正确的存储和排序,但仍然能够使用不同的排序规则执行全文搜索。该表的字符集为utf8。这是不可能的,这可能是一个mysql错误或一个功能,我没有理解。欢迎您自己尝试:创建表测试名称VARCHAR 10 NOT NULL ENGINE=MYISAM字符集utf8 COLLATE utf8\u polish\u ci;并尝试执行全文搜索SELECT*FROM test WHERE MATCHname与任何对比utf8\u general\u ci;你可能想要什么 要做的是将字段更改为utf8\u polish\u ci。因此,表将是utf8\u general\u ci,但字段将是不同的排序规则。您可以执行alter table,只需更改一个字段的排序规则。尽管UTF8通常以您想要的方式处理重音字符。