2011-07-29 12 views
18

Necesito MySQL para almacenar números en un campo entero y mantener los ceros a la izquierda. No puedo usar la opción zerofill ya que mi campo actual es Bigint (16) y los números pueden variar en la cantidad de ceros a la izquierda. IE: 0001 - 0005, luego 008 - 010 puede necesitar ser almacenado. No me preocupa la exclusividad de los números (estos no se usan como ID ni nada) pero aún así necesito que se almacenen preferiblemente como INTS.Almacenamiento de ceros iniciales de números enteros en la base de datos MySQL como INTEGER

La cuestión usando CHAR/VARCHAR y luego typecasting los valores como enteros en PHP significa que ordenar los resultados por medio de consultas conduce a alfanuméricos clasificación, IE: ordenar por número de ASC produciría

001 
002 
003 
1 
100 
101 
102 
2 

Claramente no en orden numérico , pero en orden alfanumérico, que no es deseado.

Con la esperanza de algunas soluciones inteligentes :)

+0

enteros * No tiene * ceros a la izquierda. Solo las representaciones de cadena de ellos pueden. Entonces, si "necesita" ceros a la izquierda, tendrá que almacenar una representación de cadena. ¿Por qué no puedes hacer este tipo de formateo en tiempo de visualización, en lugar de ponerlo en la base de datos? –

+0

1 y 001 y valores diferentes. Pero como int, son lo mismo: ¿cómo deben ordenarse y compararse? como int o como varchar? – gbn

Respuesta

6

Todavía se puede ordenar la cadena (char/varchar) como columnas de enteros usando CAST

ORDER BY CAST(`col_name` AS SIGNED) DESC 

lo tanto, puede almacenarlos en campos de tipo CHAR/VARCHAR .

+2

También podría hacer 'ORDER BY col_name + 0 DESC' para ordenar un varchar como entero –

6

No puede almacenar un número entero con ceros a la izquierda. Una forma es mantenerlo tanto en varchar como en int columnas. En este caso, necesita dos columnas, un valor y el otro intValue y, al ordenar, puede usar intValue para ordenar. Esto es fácil de implementar.

Select Value from Table order by intValue; 

La otra opción puede ser el uso de dos columnas, una Valu y othe NumOfZero y utilizar éstos para los resultados deseados. Esto es complejo, pero puede ser ligero en la base de datos.

+0

Nota: si sabe que la columna siempre tendrá la misma longitud, use CHAR, no VARCHAR. –

19

Mantenga los números almacenados como enteros.

A continuación, utilice la función LPAD() para mostrar los números (izquierda) rellena con ceros:

SELECT LPAD(14, 7, '0') AS padded; 

| padded | 
----------- 
| 0000014 | 

Si el número de caracteres ZEROFILL es variable, agregar otra columna de la tabla con la longitud (zerofill).

4

Cambia la estructura del campo y crea los Atributos UNSIGNED_ZEROFILL para mantener los ceros.

Pero hay que tener cuidado a la longitud del campo, porque se va a devolver todos los números de descanso a ceros a fin de poner la longitud de su campo

Cuestiones relacionadas