Anda biasanya akan menggunakan integer daripada varchars karena mereka mengkonsumsi lebih sedikit ruang, telah memahami dengan baik pola penyortiran yang cepat untuk mengindeks dll. Integer adalah tipe data alami dari sebuah CPU, dan karenanya kinerja umumnya optimal. Biasanya integer adalah 4 byte, setara dengan hanya 4 karakter dalam varchar (non-unicode).
Jika Anda khawatir kehabisan ruang dengan tipe INT, cobalah BIGINT, yang memberi Anda angka 8-byte. Batas ini sangat besar, dan Anda mungkin kehabisan ruang disk sebelum Anda mencapai batas catatan :-) Kinerja BIGINT juga akan sangat baik, terutama karena banyak server sekarang 64-bit juga .
Jawaban untuk bagian pertama dari pertanyaan Anda tentang apa yang terjadi ketika Anda kehabisan INTs tidak sederhana, terutama seperti yang Anda katakan tanpa mengubah datatype ke BIGINT. Pada dasarnya tidak banyak yang dapat Anda lakukan, dan apa yang dapat Anda lakukan sangat dibatasi oleh sifat data dalam database Anda. Catatan apa yang asing kunci untuk data ini? Apakah Anda masih membutuhkan semua data dalam tabel itu dan catatan terkait? Dengan asumsi bahwa Anda dapat mengarsipkan banyak data awal (dan data terkait), maka satu-satunya hal yang dapat saya sarankan adalah memindahkan data dari tabel (misalkan 1 hingga X juta catatan pertama), lalu mengatur ulang seed identitas ke 1. Ada segala macam alasan meskipun saya tidak akan merekomendasikannya - misalnya ada banyak bit kode yang saya lihat yang melakukan hal-hal seperti memeriksa nilai maksimum bidang id, untuk melihat apa yang baru saja ditambahkan, dan itu tidak akan berhasil (dan tidak boleh dilakukan). Juga, orang berasumsi bahwa catatan N dibuat sebelum N +1. Saya kira tidak ada jawaban yang mudah.
Akhirnya, saya tidak tahu tentang MySQL, tetapi SQL Server akan memberikan kesalahan overflow jika Anda mencapai batasnya.