Estás confundiendo
representación visual de un dato, con
requisitos de almacenamiento. Son cosas completamente diferentes.
Un numero de factura se almacena como INT UNSIGNED, lo mismo que cualquier otro código numérico secuencial. El que luego se represente con un ancho de 8 dígitos, rellenado a la izquierda con ceros es un problema de
programación, no de datos. El dato sigue siendo el mismo sin importar como lo representes luego.
Si más adelante quieres que salga con un formato determinado, es decir con una cantidad de ceros a la izquierda, directamente en la consulta, eso también se puede, y es muy sencillo, sin por eso necesitar corromper los datos de la tabla.
Puedes hacerlo así:
Código SQL:
Ver originalmysql> SELECT CONCAT(LPAD(12, 4,'0'), '-', LPAD(340, 8,'0')) FACTURA;
+---------------+
| FACTURA |
+---------------+
| 0012-00000340 |
+---------------+
1 ROW IN SET (0.05 sec)
O simplemente manejarlo por programación (OFF TOPIC en este foro).
El único caso donde se debe usar obligatoriamente un VARCHAR para almacenar un código es cuando se trata de un código de barras, porque los ceros tienen valor de representación, es decir, son parte del valor a almacenar. Pero se trata de un caso especial y sólo para esos códigos.
Asimismo, los códigos que se guardan obligatoriamente como VARCHAR son sólo los que llevan letras...