我有一个应用程序,每个用户帐户都可以设置他们首选的应用程序语言。我将这些语言首选项存储为IETF BCP47 语言标签(例如“de”、“en-US”)。现在,对于该用户的查询,我想根据他们的语言偏好对结果进行排序。
想象一下,我在一个带有 utf8mb4_general_ci 排序规则的表中拥有数据 AAA、TTT、OOO、ÖÖÖ。
如果我想让它们为德国用户排序,我可以这样做
SELECT word FROM `words` order by word collate utf8mb4_german2_ci
这会给我命令
AAA, ÖÖÖ, OOO, TTT
然而,对于冰岛用户,使用utf8mb4_icelandic_ci
我会正确得到的排序规则
AAA、OOO、TTT、ÖÖÖ
现在,在我的应用程序中,我不为该用户保存utf8mb4_icelandic_ci
or ,但我保存or 。utf8mb4_german2_ci
is
de-DE
有没有办法可以将此is
或de-DE
BCP47 语言标签直接发送到 MariaDB 以指定排序规则而不是排序规则名称?或者我是否必须在我的应用程序中的语言标记和排序规则名称之间进行映射才能为用户发送正确的排序规则信息?
(没有直接的方法来做你假设的事情。)
构建一个以“de”为参数并构造和执行的存储过程
它可能涉及一个相对静态的查找表,将“de”和“de-DE”映射到“utf8mb4_german2_ci”等。
请参阅有关定义存储过程以及如何使用的文档
CONCAT()
,PREPARE
等等EXECUTE
。运行
SHOW COLLATION LIKE 'utf8mb4%';
以查看哪些排序规则可用。(它因 MySQL/MariaDB 版本而异。)