MySql: Tinyint (2) vs tinyint (1) - qual é a diferença?

183

Eu sabia booleano no mysql como tinyint (1).

Hoje vejo uma mesa com definido um inteiro como tinyint(2), e também outros gostam int(4), int(6)...

O que o tamanho significa no campo do tipo inteiro e tinyint?

realtebo
fonte
4
Leia sobre os tipos de dados do MySQL Inteiro aqui .
11133 Bud Damyanov
2
A resposta de @ AamirR é a correta #
evilReiko 15/02
1
@evilReiko zerofill também não faz diferença na maneira como o valor é armazenado, trata-se realmente de apresentação ... espaços ou zeros não fazem diferença na exatidão da resposta de alguém imo
Ja͢ck

Respostas:

94

Significa largura de exibição

Se você usa tinyint (1) ou tinyint (2), isso não faz nenhuma diferença.

Eu sempre uso tinyint (1) e int (11), usei vários clientes mysql (navicat, sequel pro).

Isso não significa nada! Fiz um teste, todos os clientes acima ou mesmo o cliente da linha de comando parecem ignorar isso.

Porém, a largura da exibição é mais importante se você estiver usando a ZEROFILLopção, por exemplo, sua tabela possui as 2 colunas seguintes:

Um zerofill tinyint (2)

B tinyint (4) zerofill

ambas as colunas têm o valor 1, a saída para a coluna A seria 01e 0001para B , como visto na captura de tela abaixo :)

zerofill com largura de exibição

AamirR
fonte
20
Estranhamente, acabei de descobrir que, no conector oficial do C # do MySQL, tinyint (1) nunca retorna valores diferentes de 0 e 1. Isso provavelmente tem a ver com o tinyint (1) sendo automaticamente reconhecido como booleano. Apenas um aviso, às vezes importa.
Daniel Sharp
Não é melhor usar um tipo e tamanho inteiro o menor possível? Fiquei com a impressão de que essa memória salva no MySQL.
Nclsvh
Como @ Daniel-Sharp salienta, isso pode parecer importante para os conectores. Apenas tive um problema com o Hibernate usando o JDBC relatando que ele interpretava um TINYINT (1) como um BIT.
Sfj
2
@DanielSharp que provavelmente se deve à opção tinyInt1isBit de conexão, cujo padrão é true. Veja dev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56
1
Eu sempre pensei que isso tinha algo a ver com a quantidade de números aceitos (por exemplo, int (4) não permitindo nada acima de 9999). Acho que sempre pensei errado então. Na linha de comando do PHP e do MySQL, vejo o valor acima dele bem.
Joshua Bakker
226

O (m)indica a largura de exibição da coluna; aplicativos como o cliente MySQL fazem uso disso ao mostrar os resultados da consulta.

Por exemplo:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

Aqui a, be cestão usando TINYINT(1), TINYINT(2)eTINYINT(3) respectivamente. Como você pode ver, ele preenche os valores no lado esquerdo usando a largura da tela.

É importante observar que isso não afeta o intervalo de valores aceito para esse tipo específico, ou seja, TINYINT(1)ainda aceita [-128 .. 127].

Ja͢ck
fonte
16
o que significa 'largura da coluna' ??
realtebo 12/10/12
8
@realtebo é usado principalmente pelo cliente de linha de comando mysql para fins de exibição.
Ja͢ck
3
O número de "dígitos" mostrado pela interface. Em outras palavras, ele irá preencher zeros à esquerda. Esse tipo de recurso fazia sentido nos primeiros dias dos bancos de dados, mas agora é apenas legado.
Denilson Sá Maia
2
@ Kailas Se você não estiver usando o cliente mysql? Nenhum mesmo.
Ja͢ck
11
@Kailas No! tinyint (1) não aceita apenas 0-9. Ele aceita toda a gama do que tinyint pode conter.
Ja͢ck
18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)
zloctb
fonte
11
Edite sua resposta para incluir algumas explicações. As respostas somente de código fazem muito pouco para educar futuros leitores de SO. Sua resposta está na fila de moderação por ser de baixa qualidade.
Mckmackusa 22/04
14

Sobre o INT, TINYINT ... Esses são tipos de dados diferentes, INT é um número de 4 bytes, TINYINT é um número de 1 byte. Mais informações aqui - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

A sintaxe do tipo de dados TINYINT é TINYINT (M), onde M indica a largura máxima de exibição (usada apenas se o seu cliente MySQL suportar).

Atributos de tipo numérico .

Devart
fonte
1
o que significa 'largura da tela'!?
realtebo 12/10/12
2
A partir da referência - Por exemplo, INT (4) especifica um INT com uma largura de exibição de quatro dígitos. Essa largura de exibição opcional pode ser usada por aplicativos para exibir valores inteiros com largura inferior à largura especificada para a coluna, preenchendo-os com espaços à esquerda.
Devart
2
Mas eu não vi aplicativos ou clientes MySQL que usam esse recurso. Eu sempre uso INT (11) e uso funções de formatação para personalizar a saída.
Devart