mysql - 根据 MySQL 数据库中国家/语言特定的排序规则按名称对客户进行排序

标签 mysql sorting grails web internationalization

我们有来自不同国家/地区的客户以他们自己的母语(瑞典语、挪威语、波兰语、德语、西类牙语等)使用我们的 Grails 网络应用程序,并且他们保存本地数据。一个示例是一个客户表,其中包含名字和姓氏列,需要按预期以本地语言进行排序。这意味着:

  • 一位瑞典客户希望根据排序规则 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),或者引用具有不同列的特定表。
  • 在应用层而不是数据库中实现排序。

在性能、实现时间和可维护性方面,上述哪些解决方案是最佳方法?

最佳答案

让我们试着总结一下。

我会立刻放弃在应用层对记录进行排序的想法。所有表数据都必须从数据库检索到应用程序,这将很快成为瓶颈,而且这将需要额外的编程。

将排序规则应用于特定的选择查询:最少的编程量,但 MySQL 必须将所有记录复制到临时表,使用给定的排序规则对其进行排序,然后以您的前 30 条记录为例。这将比您的应用程序更有效地完成,但随着您的表的增长,它将花费越来越多的时间和内存。然而,对于几千名客户来说,这是完全可以接受的方法。

如果您期望更多的客户并希望优化性能和服务器负载,您可以使用额外的列,使用所需的排序规则进行索引:name_swe、name_ger 等。您的应用程序可以将每个客户的姓名存储到所有这些列中,并仅从中选择具有所需排序规则的那个。这需要额外的编程和冗余存储,但您将只按要求的顺序读取所需的数据,而无需临时表和额外的处理。

以下是关于如何尝试使这些额外的列对您的应用程序透明的一些想法:

  • 您可以使用 MySQL 生成的列或触发器自动填充具有不同排序规则的列 - 因此应用程序只需插入/更新“名称”列的数据
  • 在执行选择查询时,您可以将“name_swe”、“name_ger”列作为“name”的别名——这样应用程序将只需要读取单个结果列

此方法的另一个版本是按客户所在国家/地区将客户表拆分为多个表,每个表都有所需的排序规则。您可以合并这些表以选择所有客户。

也可能一些 DBMS 可以在同一列上有多个索引和不同的排序规则 - 这将以最小的努力解决问题,但据我所知,mysql 不允许这样做。

我个人会从为选择查询设置排序规则开始,并在需要时采取性能优化措施。

关于mysql - 根据 MySQL 数据库中国家/语言特定的排序规则按名称对客户进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47113925/

相关文章:

c++ - MySQL 的连接器/C++ 可以与 Visual Studio 2017 一起使用吗?

mysql - 在数据库中存储邮件的最佳方式(后缀)

php - 使用PHP查找文件夹中最旧的文件

bash - 为什么 **sort** 不在每台机器上进行相同的排序?

java - 解决类ActionLogging,无法找到用于注释的类

php - 在 php 中测试并发 mysql 插入操作

mysql - 使用该表本身的所选值的总和更新表

r - 根据 r 中的最后一个单词对字符串进行排序

list - grails列表和createCriteria()

javascript - 重置 g :autocomplete values when blanked out