Mysql 和 LDML(附加字符与 latin1 相同)

标签 mysql utf-8 collation

我使用 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/

相关文章:

关于编码有符号/无符号的 Char C 问题

php - Codeigniter将mysql查询结果返回到单个数组

mysql - 列名和撇号

mysql - 文件编码(UTF-8 无法正常工作)

html - 我在 Web 渲染引擎中发现了错误吗?

mysql - MySql 中的非法混合排序规则错误

php - 如何使用 mysqli 设置排序规则?

sql-server - 尝试查找特定表和列时无法解决排序规则冲突

python - 使用 python 的谷歌应用程序引擎中的服务器内部错误

javascript - Prisma 客户端从表中选择所有行