Quando devo usar UNSIGNED e SIGNED INT no MySQL?


Respostas:


163

UNSIGNEDarmazena apenas números positivos (ou zero). Por outro lado, assinado pode armazenar números negativos (ou seja, pode ter um sinal negativo ).

Aqui está uma tabela dos intervalos de valores que cada INTEGERtipo pode armazenar:

Tipos e comprimentos do MySQL INTEGER
Fonte: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNEDvaria de 0a n, enquanto o sinalizado varia de aproximadamente -n/2a n/2.

Nesse caso, você tem uma AUTO_INCREMENTcoluna de ID, portanto, não terá negativos. Portanto, use UNSIGNED. Se você não usar UNSIGNEDpara a AUTO_INCREMENTcoluna, seu valor máximo possível será a metade maior (e a metade negativa do intervalo de valores não será usada).


14
Observe, entretanto, que isso UNSIGNEDé específico do MySQL e não um recurso SQL padrão. Isso significa que o uso UNSIGNEDpode tornar uma migração futura para um RDBMS diferente mais complicada ou causar dificuldades ao usar bibliotecas de software voltadas para SQL padrão, como SQLAlchemy. Acho que isso deve ser parte da resposta.
minexew


4

Basicamente com UNSIGNED, você está se dando o dobro de espaço para o número inteiro, já que especifica explicitamente que não precisa de números negativos (geralmente porque os valores que você armazena nunca serão negativos).


1

Não concordo com o vipin cp .

A verdade é que o primeiro bit é usado para representar o sinal. Mas 1 é para valores negativos e 0 é para valores positivos. Mais valores negativos são codificados de maneira diferente (complemento de dois). Exemplo com 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  

1

Para valores inteiros negativos, SIGNEDé usado e para valores inteiros não negativos, UNSIGNEDé usado. Sempre sugeriu usar UNSIGNEDpara id como uma CHAVE PRIMÁRIA.


0

Uma coisa que eu gostaria de adicionar, In a signed int, que é o default value in mysql, 1 bitserá usado para representar sign. -1 for negative and 0 for positive. Portanto, se seu aplicativo inserir apenas valores positivos, é melhor especificar não assinado.


0

Se você souber o tipo de número que armazenará, poderá escolher de acordo. Neste caso, você tem 'id', que nunca pode ser negativo. Portanto, você pode usar o int sem sinal. Intervalo de int com sinal: -n / 2 a + n / 2 Intervalo de int sem sinal: 0 a n Portanto, você tem o dobro do número de números positivos disponíveis. Escolha de acordo.


0

Acho que UNSIGNEDseria a melhor opção armazenar algo como time_duration(Ex:) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)valor em minutos ou horas ou segundos no formato, que definitivamente será um número não negativo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.