utf8_general_ci排序规则对重音不敏感的搜索/问题

时间:2011-08-19 19:34:50

标签: mysql sql utf-8 full-text-search diacritics

编辑:如果你在这里,因为你对MySQL中的抛光校对感到困惑,read this

我正在尝试在波兰城市的桌子上进行全文搜索,其中许多都包含重音字符。它意味着在ajax调用中用于自动完成,所以如果搜索是重音不敏感的话会很好。我已将行的排序规则设置为ut8_polish_ci。现在,鉴于城市“Zelów”,我像这样查询数据库

  

SELECT * FROM {城市{1}}

但无济于事。 Mysql返回一个空结果。我尝试了不同的口音,尝试在查询中添加不同的排序规则,但没有任何帮助。我不确定如何处理这个因为重音敏感度似乎记录不清楚。有什么想法吗?

<小时/> 修改

所以我发现不区分大小写的全文搜索仅在IN BOOLEAN MODE中执行,因此正确的查询将是

  

WHERE MATCH( city ) AGAINST ("zelow") {城市{1}}

之前由于a misleading comment on dev.mysql.com,我认为不然。可能会有更多,但我现在真的很困惑。

无论如何,正如下面的评论中所提到的,我在cities列上有UNIQUE索引,因此将表的排序规则更改为不区分重音的utf8_general_ci是不可能的。

但是我意识到,以下查询在使用utf8_polish_ci排序规则的表上运行良好:

  

SELECT * FROM {城市{1}}

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

  

WHERE MATCH( city ) AGAINST ( "zelow" IN BOOLEAN MODE ) {城市{1}}

然而,这会产生以下错误:

  

SELECT * FROM

这真的开始让我感到紧张。不妨放弃全文搜索,转而采用简单的类似方法,但在具有近50k记录的表格中似乎不合理,这将被密集查询......

<小时/> 最后编辑 好吧,布尔模式的东西部分废话。只是部分因为它确实像我说的那样工作,然而,在utf8_general_ci上它反过来起作用。我完全感到困惑,没有进一步研究这个问题的意愿。我决定放弃UNIQUE索引(无论如何都不会添加更多的城市,所以不需要大肆宣传)并坚持使用utf8_general_ci表格整理。我感谢所有的帮助,它引导我朝着正确的方向前进。

4 个答案:

答案 0 :(得分:3)

将整理更改为utf_general_ci。它在搜索和订购时忽略了重音,但仍然正确存储它们。

答案 1 :(得分:2)

MySQL在编码/整理领域非常灵活,可能过于灵活。更改编码/排序规则时,请确保转换表格,而不仅仅是更改编码/排序规则类型。

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

您还可以转换单个字段,因此您的表可以具有utf8_general_ci的排序规则设置,但您可以更改一个或多个字段,以便它们使用其他一些排序规则。基于您看到的“二进制”错误,您的文本字段似乎可能具有UTF8-BIN(或者是blob)的排序规则。你能发布CREATE TABLE的结果吗?

请记住,CHARACTER SET(编码)是数据的存储方式,排序是如何编制索引的。并非所有组合都有效。

我原来的问题和疑问可能会有所帮助: Converting mysql tables from latin1 to utf8

答案 2 :(得分:0)

如果您尝试:

select * from cities where cityname like 'zelow'

答案 3 :(得分:0)

将排序规则从二进制更改为utf8_bin。 utf8_bin应与utf8_general_ci兼容,但仍允许您存储具有不同重音的城市名称。