¿Cuándo debo usar INT NO FIRMADO y FIRMADO en MySQL?

101

¿Cuándo debo usar INT NO FIRMADO y FIRMADO en MySQL? ¿Qué es mejor usar o esto es solo preferencia personal? Porque lo he visto usado así;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

y

id INT(11) NOT NULL AUTO_INCREMENT
Tux
fuente
4
PK negativo no tiene mucho sentido
zerkms
2
posible duplicado de ¿Qué significa "sin firmar" en MySQL y cuándo usarlo?
rink.attendant.6

Respuestas:

164

UNSIGNEDsolo almacena números positivos (o cero). Por otro lado, con signo puede almacenar números negativos (es decir, puede tener un signo negativo ).

Aquí hay una tabla de los rangos de valores que cada INTEGERtipo puede almacenar:

Tipos y longitudes de MySQL INTEGER
Fuente: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDvaría de 0a n, mientras que con signo varía de aproximadamente -n/2a n/2.

En este caso, tiene una AUTO_INCREMENTcolumna de ID, por lo que no tendría negativos. Por lo tanto, use UNSIGNED. Si no lo usa UNSIGNEDpara la AUTO_INCREMENTcolumna, su valor máximo posible será la mitad de alto (y la mitad negativa del rango de valores no se usará).

Chico listo
fuente
14
Sin embargo, tenga en cuenta que UNSIGNEDes específico de MySQL y no una característica estándar de SQL. Esto significa que el uso UNSIGNEDpuede complicar una futura migración a un RDBMS diferente o causarle dificultades al usar bibliotecas de software dirigidas a SQL estándar, como SQLAlchemy. Creo que esto debería ser parte de la respuesta.
minexew
8

Úselo UNSIGNEDpara números enteros no negativos.

Paul Denisevich
fuente
4

Básicamente con UNSIGNED, te estás dando el doble de espacio para el número entero, ya que especificas explícitamente que no necesitas números negativos (generalmente porque los valores que almacenas nunca serán negativos).

Srneczek
fuente
1

No estoy de acuerdo con vipin cp .

Lo cierto es que el primer bit se utiliza para representar el signo. Pero 1 es para valores negativos y 0 para valores positivos. Los valores más negativos se codifican de forma diferente (complemento a dos). Ejemplo con TINYINT:

The sign bit
|
1000 0000b = -128d  
...  
1111 1101b = -3d  
1111 1110b = -2d  
1111 1111b = -1d  

0000 0000b = 0d  
0000 0001b = 1d  
0000 0010b = 2d  
...  
0111 1111b = 127d  
Kinga la bruja
fuente
1

Para valor entero negativo, SIGNEDse usa y para valor entero no negativo, UNSIGNEDse usa. Siempre sugirió usar UNSIGNEDfor id como CLAVE PRIMARIA.

Jeque Hafizur Rahman
fuente
0

Una cosa que me gustaría agregar en a signed int, que es default value in mysql, 1 bitse usará para representar sign. -1 for negative and 0 for positive. Entonces, si su aplicación inserta solo un valor positivo, es mejor especificar unsigned.

vipin cp
fuente
0

Si conoce el tipo de números que va a almacenar, puede elegir en consecuencia. En este caso, tienes un 'id' que nunca puede ser negativo. Entonces puedes usar unsigned int. Rango de int con signo: -n / 2 a + n / 2 Rango de int sin signo: 0 a n Por lo tanto, tiene el doble de números positivos disponibles. Elija en consecuencia.

Amanecer Debanik
fuente
0

Creo que UNSIGNEDsería la mejor opción almacenar algo como time_duration(Ej .:) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)valor en formato de minutos, horas o segundos, que definitivamente será un número no negativo

Kamal
fuente