Eu tenho um aplicativo onde cada conta de usuário pode definir seu idioma de aplicativo preferido. Eu armazeno essas preferências de idioma como tag de idioma IETF BCP47 (por exemplo, "de", "en-US"). Agora, para consultas desse usuário, quero classificar os resultados com base em sua preferência de idioma.
Imagine eu tendo os dados AAA, TTT, OOO, ÖÖÖ em uma tabela com agrupamento utf8mb4_general_ci.
Se eu quiser que eles sejam classificados para um usuário alemão, posso fazer
SELECT word FROM `words` order by word collate utf8mb4_german2_ci
Que me daria a ordem
AAA, ÖÖÖ, OOO, TTT
Para um usuário islandês, no entanto, usando o agrupamento utf8mb4_icelandic_ci
, eu obteria corretamente
AAA, OOO, TTT, ÖÖÖ
Agora, na minha aplicação eu não salvo utf8mb4_icelandic_ci
ou utf8mb4_german2_ci
para aquele usuário, mas eu salvo is
ou de-DE
.
Existe uma maneira de enviar esta tag de idioma is
ou de-DE
BCP47 diretamente para o MariaDB para especificar o agrupamento em vez do nome do agrupamento? Ou eu teria que ter um mapeamento entre a marca de idioma e o nome da ordenação em meu aplicativo para enviar as informações de ordenação corretas para o usuário?
(Não há uma maneira direta de fazer o que você hipotetiza.)
Construa um procedimento armazenado que receba "de" como argumento e construa e execute
Provavelmente envolveria uma tabela de pesquisa relativamente estática que mapeia "de" e "de-DE" para "utf8mb4_german2_ci", etc.
Veja os documentos sobre a definição de Stored Procedures e como usar
CONCAT()
,PREPARE
eEXECUTE
em tal.Corra
SHOW COLLATION LIKE 'utf8mb4%';
para ver quais agrupamentos estão disponíveis. (Varia com a versão do MySQL/MariaDB.)