Il n'y a rien de mal à utiliser CHAR ou VARCHAR comme clé primaire.
Bien sûr, cela prendra un peu plus de place qu'un INT dans de nombreux cas, mais il y a de nombreux cas où c'est le choix le plus logique et peut même réduire le nombre de colonnes dont vous avez besoin, améliorant l'efficacité, en évitant d'avoir un champ d'identification séparé.
Par exemple, les codes de pays ou les abréviations d'État ont déjà des codes de caractères normalisés et ce serait une bonne raison d'utiliser une clé primaire basée sur des caractères plutôt que de créer un ID entier arbitraire pour chacun en plus.