我使用 utf8_slovenian_ci 作为列和表的排序规则。一切都很好,除了 č 和 c 被视为不同的字符(以及其他 2 个斯洛文尼亚特定字符)。
它们的排序和含义不同!但由于手机上的搜索原因,很难选择 č 所以我希望非升号字符的行为与升号字符相同:
c=č s=š z=z
反之亦然,不区分大小写。
我读到了有关在 mysql 中使用 LDML 扩展排序规则的信息,但我无法在搜索引擎中创建“bograč”=“bograc”。
有人可以帮我吗?
更新
为了简化问题,是否可以使用 LDML 使 c=č 进行搜索,并且 č 在排序中位于 c 之后?我可以修改内置排序规则还是需要创建一个新排序规则?
更新2
我的无需搜索的简化查询(例如按名称列出的所有食谱)是:
SELECT * from recipes order by RecipeName COLLATE 'utf8_slovenian_ci' asc limit 5
我得到解释:
Rows: 20.000, Extra: Using filesort
如果我不使用斯洛文尼亚排序规则(我现在在RecipeName上有general_ci)我得到:
Rows: 5, Extra: Using Index
如果我使用 WHERE LIKE='%soup%' 进行搜索,我仍然会在 20.000 行上进行文件排序,因为看起来 mysql 对整个结果集进行文件排序。
因此,对 RecipeName 列进行排序的唯一方法是使用 2 列,一列 General_ci 和一列 slovenian_ci,并使用一列进行搜索(作为我的全文搜索的一部分 - 此示例已简化),另一列用于在以下情况下进行排序:我想按食谱名称订购?或者这仍然会对整个 20.000 个食谱进行文件排序吗?
最佳答案
我没有测试,但 utf8_general_ci
排序规则不区分重音,应该按照您想要的方式进行搜索。
为了获得最佳性能,您可以在表中创建一个单独的列,即 utf8_general_ci
并在其中进行搜索:
real_column search_column
-----------------------------------
bograč bograč
那么以下应该可以工作:
SELECT real_column FROM table WHERE search_column = "bograc"
> bograč
或者,COLLATE 应该可以工作(但是太慢了!)。像这样的事情:
SELECT real_column FROM table
WHERE real_column COLLATE utf8_general_ci = "bograc";
关于Mysql 和 LDML(附加字符与 latin1 相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433539/