Stocker le nom d'utilisateur saisi à l'origine et une version canonique (minuscules pour votre application) est parfaitement raisonnable. Assurez-vous simplement que le champ canonique est mis à jour dans votre modèle chaque fois que le nom d'utilisateur est défini et vérifiez les violations de contrainte via l'index unique du champ canonique.
Un autre scénario où cette solution (champ original et canonique) a du sens est celui des articles, où le même titre peut être réutilisé mais le slug (pour les URL) doit être unique.