Quando devo usar UNSIGNED e SIGNED INT no MySQL?

100

Quando devo usar UNSIGNED e SIGNED INT no MySQL? O que é melhor usar ou isso é apenas preferência pessoal? Porque eu já vi ser usado assim;

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

e

id INT(11) NOT NULL AUTO_INCREMENT
Tux
fonte
4
PK negativa não faz muito sentido
zerkms
2
possível duplicata de O que significa "unsigned" no MySQL e quando usá-lo?
rink.attendant.6 de

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).

Wiseguy
fonte
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
8

Use UNSIGNEDpara números inteiros não negativos.

Paul Denisevich
fonte
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).

Srneczek
fonte
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  
Kinga a bruxa
fonte
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.

Sheikh Hafizur Rahman
fonte
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.

vipin cp
fonte
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.

Debanik Dawn
fonte
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

Kamal
fonte