【发布时间】:2018-04-17 06:10:25
【问题描述】:
我们有来自不同国家/地区的客户以他们自己的母语(瑞典语、挪威语、波兰语、德语、西班牙语等)使用我们的 Grails Web 应用程序,他们保存本地数据。一个例子是一个客户表,其中包含需要以本地语言按预期排序的名字和姓氏列。这意味着:
- 一位瑞典客户希望根据排序规则 utf8mb4_swedish_ci 对客户列表进行排序,该排序规则将按预期对 a/o/å/ä/ö 进行排序。 Örjan 将排在最后,并且与 Olof 不在同一个位置。
一位德国客户想要根据排序规则 utf8mb4_german2_ci 对客户列表进行排序,该排序规则将按预期排序 ß/ss/u/ü。
挪威语、波兰语等其他语言的类似情况。
我们所有的专栏都有字符集 utf8mb4,以便能够支持存储多种语言的字符。
以前,我们使用 utf8mb4_swedish_ci 作为我们可以排序的所有列的排序规则,但由于我们正在吸引来自其他国家和语言的客户并转向国际市场,我们需要实施更改以支持全球客户。
我们正在研究以下解决方案:
- 在数据库中使用 utf8mb4_unicode_ci 作为排序规则,但根据应用程序中使用的语言/位置,在我们所有的查询中添加一个排序规则表达式,例如“按名字排序 utf8mb4_swedish_ci”。
- 在具有目标排序规则的数据库中使用多个列,例如“firstname_swedish”(utf8mb4_swedish_ci)、“firstname_german”(utf8mb4_german2),或引用具有不同列的特定表。
- 在应用层而不是数据库中实现排序。
在性能、实施时间和可维护性方面,上述哪些解决方案是最佳方法?
【问题讨论】:
-
您想要一份来自所有国家/地区的完整客户列表,以某种方式“正确”排序?这似乎是不可能的——想想中文、从右到左的文字等等。也许您可以按客户国家或语言组对您的列表进行分组。
-
您也可以将排序规则应用于查询,而不是表:SELECT k FROM t1 ORDER BY k COLLATE latin1_german2_ci。但这不允许您使用索引。因此,一切都取决于您要实现的目标。
-
我们的每个管理用户(可能位于不同的国家,如瑞典、波兰、德国等)只需要对他们自己的客户进行分类。但是所有客户都存储在同一个客户表中。是的,查询的排序规则是我上面介绍的解决方案之一。正如你所说,它会对性能产生影响,我们需要重写我们所有的应用程序逻辑。我们正在寻找一种更简单的解决方案,它只能在数据库中应用,因此我们不需要过多地重写我们的数据访问代码。
标签: mysql sorting grails web internationalization