同一MariaDB列的多个排序规则?

时间:2017-09-11 05:22:53

标签: mysql mariadb collation culture

如果需要不同的排序规则,如何有效地对字符串列执行ORDER BY,具体取决于文化?也就是说,来自不同文化的用户的数据存储在同一个表和同一列中,但每个用户自然希望看到它根据它的区域设置进行排序(区域设置当然是已知的并且每个行都是固定的。桌子)。并且表格可能很长,因此列需求和索引不能在应用程序端进行后期处理以进行所需的排序规则(它的数据库任务可以进行繁重的工作,对吧?)。

例如,utf8_general_ci会产生与utf8_swedish_ci不同的结果。

虽然我认为问题对任何国际项目都应该是明显的,但我找不到合适的解决方案。我自己只能对以下解决方案进行成像,这些解决方案并不是那么好,我怀疑没有更好的办法可以做到:

  1. 为每个归类使用单独的字段
  2. 也许,每个文化都可以创建一个视图并相应地建立索引(虽然我没有使用过MariaDB视图,所以这很理论化)
  3. 使用单独的"代理"字段只是为了整理,也许是VIRTUAL
  4. 现在,如果只有一个可排序的字符串列,但可能有几个。解决这个问题的目的和正确方法是什么?

1 个答案:

答案 0 :(得分:1)

只要您使用相同的字符集(在您的情况下为utf8)进行列存储和阅读,您可以在COLLATE some-utf8-collation子句后使用ORDER BY column-name

SELECT * FROM sometable ORDER BY somecolumn COLLATE utf8_swedish_ci

在我的测试中,这产生的排序与德国排序不同:

SELECT * FROM sometable ORDER BY somecolumn COLLATE utf8_german2_ci

嗯,只要数据包含相关字符,例如德国变形金刚üöä。如果没有,你就不会看到差异。

ORDER子句中的多个列都有自己的COLLATE术语:

SELECT * FROM sometable
ORDER BY
    somecolumn COLLATE utf8_german2_ci,
    secondcolumn COLLATE utf8_german2_ci