MySQL - 带有波兰字符的重音不敏感搜索 - UTF8

时间:2013-10-26 18:23:45

标签: mysql utf-8 collation

我找到了很多关于校对和重音不敏感搜索的答案,阅读了1000篇关于这个问题的帖子和文章,但没有找到答案。

有没有人知道如何强制mysql使用所有波兰字符搜索重音不敏感?也许有人得到了一个编译的整理文件(Debian)?

请注意:

  • 将排序规则设置为utf8_general_ci无济于事。它不能正确支持Ł。但它确实破坏了搜索顺序。
  • 将排序规则设置为utf8_unicode_ci无济于事。与上述相同。
  • 无法编辑归类文件,因为它是多字节编码。并且必须编译多字节字符集。
  • 将所有不受支持的字母替换为支持的字母不是解决方法。

我真的不明白为什么MySQL工作人员不会将此作为一个bug来威胁。显而易见的是,它已经存在了很长时间。自4.xx以来,他们确实纠正了Ś封信...所以为什么不Ł?!

我找到了This MySQL functionality的一些引用,但没有关于如何使用它的信息。我真的不明白那里写的是什么,是否可以帮助我。

试验:

mysql> show full columns from test;
+-------+--------------+----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type         | Collation      | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+--------------+----------------+------+-----+---------+-------+---------------------------------+---------+
| str   | varchar(255) | utf8_polish_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+--------------+----------------+------+-----+---------+-------+---------------------------------+---------+

mysql> insert into test values('Łomża');

...

mysql> select str from test where str like '%Łomża%'\G
*************************** 1. row ***************************
str: Łomża

mysql> select str from test where str like '%Łomza%'\G
Empty set (0.00 sec)

--

mysql> select str from test where str like '%Łomza%' collate utf8_general_ci\G
*************************** 1. row ***************************
str: Łomża

mysql> select str from test where str like '%Lomza%' collate utf8_general_ci\G
Empty set (0.00 sec)

--

mysql> select str from test where str like '%Łomza%' collate utf8_unicode_ci\G
*************************** 1. row ***************************
str: Łomża

mysql> select str from test where str like '%Lomza%' collate utf8_unicode_ci\G
Empty set (0.00 sec)

2 个答案:

答案 0 :(得分:1)

我刚刚开始使用MySql,“波兰语”问题的答案是整理utf8_unicode_520_ci,其中l =ł= L =Ł-其他都一样 波兰语,带有重音符号。没有字符转换,没有ascii列,没有任何东西……经过多年在Sqlite中搜索ł/Ł解决方案。

答案 1 :(得分:0)

我建议在数据库中再搜索一列,例如'str_search'。在数据库中将字符串插入'str_search'时,请在PHP中创建并使用函数,如下所示:

 function convertPolishChars($phrase)
 {
    $phrase = str_replace("ą", "a", $phrase);
    $phrase = str_replace("Ą", "A", $phrase);

    $phrase = str_replace("ć", "c", $phrase);
    $phrase = str_replace("Ć", "C", $phrase);

    $phrase = str_replace("ę", "e", $phrase);
    $phrase = str_replace("Ę", "E", $phrase);

    $phrase = str_replace("ł", "l", $phrase);
    $phrase = str_replace("Ł", "L", $phrase);

    $phrase = str_replace("ń", "n", $phrase);
    $phrase = str_replace("Ń", "N", $phrase);

    $phrase = str_replace("ó", "o", $phrase);
    $phrase = str_replace("Ó", "O", $phrase);

    $phrase = str_replace("ś", "s", $phrase);
    $phrase = str_replace("Ś", "S", $phrase);

    $phrase = str_replace("ź", "z", $phrase);
    $phrase = str_replace("Ź", "Z", $phrase);

    $phrase = str_replace("ż", "z", $phrase);
    $phrase = str_replace("Ż", "Z", $phrase);

    return $phrase;
 }

"INSERT INTO test (str, str_search) VALUES ('Łomża', '" . convertPolishChars('Łomża') . "')"

在编写SQL查询时,请编写如下内容:

"SELECT str FROM test WHERE str_search like '%" . convertPolishChars('Łomża') . "%'"

此方法将更快地执行查询字符串,而不是在SQL语句中执行任何转换。

确保索引“str_search”列。

对于较大的数据库,我建议使用 MATCH AGAINST 进行 FULLTEXT 搜索。 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html