Geralmente, você usaria números inteiros em vez de varchars, porque eles consomem menos espaço, têm um padrão de classificação bem compreendido, são rápidos para indexar etc. Inteiros são tipos de dados naturais de uma CPU e, portanto, o desempenho geralmente é ideal. Normalmente, um número inteiro tem 4 bytes, equivalente a apenas 4 caracteres em um varchar (não unicode).
Se você estava preocupado com a falta de espaço com um tipo INT, tente o BIGINT, que fornece números de 8 bytes. O limite é muito grande e você provavelmente não terá mais espaço em disco antes de atingir esse limite de registros :-) O desempenho do BIGINT também será muito bom, especialmente porque muitos servidores agora também têm 64 bits .
A resposta para a primeira parte da sua pergunta sobre o que acontece quando você acaba com as INTs não é simples, especialmente como você disse sem alterar o tipo de dados para BIGINT. Basicamente, não há muito o que você possa fazer, e o que você poderá fazer é muito limitado pela natureza dos dados em seu banco de dados. Quais registros são de chave estrangeira para esses dados? Você ainda precisa de todos os dados nessa tabela e dos registros relacionados? Supondo que você possa arquivar muitos dados iniciais (e seus dados relacionados), a única coisa que posso sugerir é mover os dados para fora da tabela (digamos os primeiros 1 a X milhões de registros) e, em seguida, redefinindo a semente de identidade para 1. Há vários tipos de motivos que eu não recomendaria - por exemplo, existem muitos bits de código que vi que fazem coisas como verificar o valor máximo de um campo de ID, para ver o que acabou de ser adicionado, e isso não funcionaria (e não deve ser feito). Além disso, as pessoas assumem que o registro N foi criado antes de N + 1. Nenhuma resposta fácil, eu acho.
Por fim, não conheço o MySQL, mas o SQL Server causaria um erro de estouro se você atingisse o limite.