Por lo general, usaría números enteros en lugar de varchars porque consumen menos espacio, han entendido bien que los patrones de clasificación son rápidos de indexar, etc. Los enteros son tipos de datos naturales de una CPU y, por lo tanto, el rendimiento es generalmente óptimo. Normalmente, un número entero es de 4 bytes, equivalente a solo 4 caracteres en un varchar (no unicode).
Si le preocupaba quedarse sin espacio con un tipo INT, intente con BIGINT, que le proporciona números de 8 bytes. El límite de esto es bastante grande, y probablemente se quedará sin espacio en disco antes de alcanzar ese límite de registros :-) El rendimiento de BIGINT también será muy bueno, especialmente porque muchos servidores ahora también tienen 64 bits. .
La respuesta a la primera parte de su pregunta sobre lo que sucede cuando se queda sin INTs no es simple, especialmente como dijo sin cambiar el tipo de datos a BIGINT. Básicamente, no hay mucho que pueda hacer, y lo que puede hacer está muy limitado por la naturaleza de los datos en su base de datos. ¿Qué registros tienen claves externas para estos datos? ¿Todavía necesita todos los datos en esa tabla y los registros relacionados? Suponiendo que podría archivar una gran cantidad de datos iniciales (y sus datos relacionados), entonces lo único que puedo sugerir es mover los datos fuera de la tabla (digamos los primeros 1 a X millones de registros), y luego restablecer el origen de identidad a 1. Hay todo tipo de razones, aunque no lo recomendaría, por ejemplo, hay muchos bits de código que he visto que hacen cosas como verificar el valor máximo de un campo de identificación, para ver lo que se acaba de agregar, y eso no funcionaría (y no debería hacerse). Además, las personas suponen que el registro N se creó antes de N + 1. No hay una respuesta fácil, creo.
Finalmente, no sé acerca de MySQL, pero SQL Server daría un error de desbordamiento si alcanza el límite.