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

Multiple collations for the same MariaDB column?

当需要不同的排序规则时,如何有效地对字符串列执行 ORDER BY,具体取决于文化?也就是说,来自不同文化的用户的数据存储在相同的 table 和同一列中,但每个用户自然希望看到它根据其语言环境排序(语言环境当然是已知的,并且每一行中的每一行都是固定的) table)。 table 可能很长,因此列需要和索引并且不能在应用程序端被 post 处理为所需的排序规则(这是数据库任务来完成繁重的工作,对吧?)。

例如,utf8_general_ciutf8_swedish_ci 产生不同的结果。

虽然我认为这个问题对于任何国际项目来说都是显而易见的,但我找不到任何 suitable 解决方案。我自己只能想象以下解决方案,这些解决方案不是很好,我怀疑没有什么比这更好的了:

  1. 为每个排序规则使用单独的字段
  2. 也许,可以为每个文化创建一个视图并相应地建立索引(虽然我没有使用过 MariaDB 视图,所以这是非常理论化的)
  3. 使用单独的 "surrogate" 字段仅用于整理,可能是 VIRTUAL

现在,如果只有一个 sortable 字符串列,但可能有多个。解决这个问题的正确方法是什么?

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

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