Eu só quero saber qual é o benefício / uso da definição ZEROFILL
para INT
DataType no MySQL
?
`id` INT UNSIGNED ZEROFILL NOT NULL
Eu só quero saber qual é o benefício / uso da definição ZEROFILL
para INT
DataType no MySQL
?
`id` INT UNSIGNED ZEROFILL NOT NULL
Respostas:
Quando você seleciona uma coluna com o tipo, ZEROFILL
ela preenche o valor exibido do campo com zeros até a largura de exibição especificada na definição da coluna. Valores maiores que a largura da exibição não são truncados. Observe que o uso de ZEROFILL
também implica UNSIGNED
.
O uso ZEROFILL
e a largura de exibição não afetam como os dados são armazenados. Afeta apenas como é exibida.
Aqui está um exemplo de SQL que demonstra o uso de ZEROFILL
:
CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;
Resultado:
x y
00000001 1
00000012 12
00000123 123
123456789 123456789
Um exemplo para entender, onde o uso de ZEROFILL
pode ser interessante:
Na Alemanha, temos códigos postais de 5 dígitos. No entanto, esses códigos podem começar com um zero, assim 80337
como um CEP válido para munic, 01067
é um CEP de Berlim.
Como você vê, qualquer cidadão alemão espera que os códigos postais sejam exibidos como um código de 5 dígitos, então isso 1067
parece estranho.
Para armazenar esses dados, você pode usar um VARCHAR(5)
ou INT(5) ZEROFILL
enquanto o inteiro preenchido com zerar tem duas grandes vantagens:
1067
, você ainda 01067
voltaTalvez este exemplo ajude a entender o uso de ZEROFILL
.
É um recurso para personalidades perturbadas que gostam de caixas quadradas.
Você insere
1
23
123
mas quando você seleciona, ele preenche os valores
000001
000023
000123
Ajuda na classificação correta no caso em que você precisará concatenar esse "número inteiro" com outra coisa (outro número ou texto) que precisará ser classificada como "texto".
por exemplo,
se você precisar usar os números dos campos inteiros (digamos 5) concatenados como A-005 ou 10/0005
Sei que estou atrasado para a festa, mas acho que o zerofill é útil para representações booleanas de TINYINT (1). Nulo nem sempre significa Falso, às vezes você não quer. Ao preencher um minúsculo, você efetivamente converte esses valores em INT e remove qualquer confusão que seu aplicativo possa ter durante a interação. Seu aplicativo pode tratar esses valores de maneira semelhante ao tipo de dados primitivo True = Not (0)
666
que eu prefiro manter esta resposta como for;-)
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)
Quando usado em conjunto com o atributo opcional (não padrão) ZEROFILL, o preenchimento padrão de espaços é substituído por zeros. Por exemplo, para uma coluna declarada como INT (4) ZEROFILL, um valor de 5 é recuperado como 0005.
Se você especificar ZEROFILL para uma coluna numérica, o MySQL adicionará automaticamente o atributo UNSIGNED à coluna.
Os tipos de dados numéricos que permitem o atributo UNSIGNED também permitem SIGNED. No entanto, esses tipos de dados são assinados por padrão, portanto, o atributo SIGNED não tem efeito.
A descrição acima é retirada do site oficial do MYSQL.
zerofill
não é padrão. " OZEROFILL
atributo é ignorado quando uma coluna está envolvida em expressões ouUNION
consultas. Se você armazenar valores maiores que a largura de exibição em uma coluna inteira que possui oZEROFILL
atributo, poderá ter problemas quando o MySQL gerar tabelas temporárias para algumas associações complicadas. Nesses casos , MySQL assume que os valores de dados encaixar dentro da largura de exibição da coluna. "