В чем преимущество zerofill в MySQL?

168

Я просто хочу знать, в чем выгода / использование определения ZEROFILLдля INTDataType MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 
diEcho
источник
Хороший вопрос. Смежные вопросы, которые также можно задать: Есть ли веские причины не использовать ZEROFILL? Каковы недостатки и потенциальные недостатки использования ZEROFILL? Преимущества перевешивают недостатки?
spencer7593
См. Объяснение stackoverflow.com/questions/5634104/…
priyabagus

Ответы:

254

Когда вы выбираете столбец с типом, ZEROFILLон дополняет отображаемое значение поля нулями до ширины отображения, указанной в определении столбца. Значения, превышающие ширину экрана, не усекаются. Обратите внимание, что использование ZEROFILLтакже подразумевает UNSIGNED.

Использование ZEROFILLи ширина отображения не влияет на то, как хранятся данные. Это влияет только на то, как это отображается.

Вот пример SQL, демонстрирующий использование 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;

Результат:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789
Марк Байерс
источник
52
@diEcho: если, например, вы хотите, чтобы все номера ваших счетов отображались с 10 цифрами, вы можете объявить тип этого столбца как INT (10) ZEROFILL.
Марк Байерс
76
Я настоятельно рекомендую вам держаться подальше от этой функции - то, как числовое значение отображается / форматируется, является проблемой презентации, а не тем, что относится к уровню базы данных; по крайней мере, если вы используете базу данных для поддержки программного обеспечения. Имейте в виду, что это может вызвать проблемы - если вы анализируете значение с начальным нулем как целое число, многие анализаторы будут воспринимать значение как восьмеричное, что, вероятно, не то, что вам нужно. Единственный раз, когда вы должны использовать эту функцию, это как (хранение) оптимизация, когда то, что вы на самом деле храните, представляет собой строку цифр (фиксированной длины).
mindplay.dk
3
@ mindplay.dk: зависит. Если вы храните что-то вроде GTIN, они должны быть длиной в 14 цифр, но также могут содержать только 8 цифр и дополняться нулями слева. В этом случае полагаться на выходную сторону было бы неправильно, потому что это не просто десятичная дробь, а ключ.
DanMan
1
@MarkByers, если говорить на практике, разве большинство клиентских библиотек (например, PHP) просто удаляют нули, прежде чем передать их в код приложения? Если так, то это действительно кажется бессмысленным. Плохой дизайн на заре MySQL.
Pacerier
131

Один пример, чтобы понять, где использование ZEROFILLможет быть интересно:

В Германии у нас есть 5-значный почтовый индекс. Однако эти коды могут начинаться с нуля, поэтому 80337действительный почтовый индекс для munic 01067- это почтовый индекс Берлина.

Как видите, любой гражданин Германии ожидает, что почтовые индексы будут отображаться в виде 5-значного кода, поэтому 1067выглядит странно.

Чтобы сохранить эти данные, вы можете использовать a VARCHAR(5)или INT(5) ZEROFILLтогда как целое число с нулевым заполнением имеет два больших преимущества:

  1. Намного меньше места на жестком диске
  2. Если вы вставите 1067, вы все равно 01067вернетесь

Может быть, этот пример помогает понять использование ZEROFILL.

Фил
источник
10
Стоит добавить, что клиент SQL, отображающий данные, отвечает за форматирование чисел с ведущими нулями. Это не то, что «автоматически» происходит с каждым приложением, обрабатывающим данные.
a_horse_with_no_name
Столбцы с фиксированной шириной также лучше, потому что они уменьшают фрагментацию на диске.
DanMan
@Phil, хотя, на практике, не будут ли большинство клиентских библиотек (например, PHP) просто удалять нули до того, как они будут переданы в код приложения? Если так, то это действительно кажется бессмысленным. Плохой дизайн на заре MySQL.
Pacerier
3
@Pacerier Это зависит от того, как вы хотите, чтобы данные в вашей клиентской библиотеке были представлены: как число или как строка. Немецкий почтовый индекс - это не число, это строка, состоящая только из цифр. Поэтому я не согласен с вашим утверждением о плохом дизайне в первые дни MySQL. Это все еще правильный подход, но для редких случаев.
Фил
61

Это особенность для обеспокоенных личностей, которые любят квадратные коробки.

Вы вставляете

1
23
123 

но когда вы выбираете, он дополняет значения

000001
000023
000123
Элайджа Саункин
источник
15

Это помогает в правильной сортировке в том случае, если вам нужно объединить это «целое число» с чем-то другим (другим числом или текстом), которое затем необходимо будет отсортировать как «текст».

например,

если вам нужно будет использовать число целочисленного поля (скажем , 5) сцепляются , как A-005 или 10/0005

кругозор
источник
4

Я знаю, что опаздываю на вечеринку, но считаю, что нулевое заполнение полезно для логических представлений TINYINT (1). Нуль не всегда означает Ложь, иногда вы этого не хотите. За счет нулевого заполнения tinyint вы эффективно конвертируете эти значения в INT и удаляете любые путаницы, которые могут возникнуть у приложения при взаимодействии. Затем ваше приложение может обрабатывать эти значения аналогично примитиву типа True = Not (0)

Marlin
источник
1
Спасибо, но, к сожалению, я только что провел несколько тестов для базы данных mysql, и она не обнуляет нулевые значения: - /. Эта цель по-прежнему достигается путем ограничения поля, чтобы не допустить нулевое значение. Я должен знать лучше, чем пытаться отвечать на вопросы о dbs, которые я обычно не использую. Удаляю мой ответ прежде, чем люди будут слишком счастливы. LOL
Марлин
1
Полезно? Это неверно Zerofill ничего не делает (кроме добавления Unsigned), когда длина дисплея равна 1.
Brilliand
@Marlin, и вы всегда должны устанавливать значение по умолчанию для true или false ... если вы не используете значения по умолчанию, то проблема, о которой вы упомянули, НЕ будет единственной ... NOT NULL также является обязательным :)
bakriawad
Я бы понизил голос, но ваш представитель в 666таком, поэтому я предпочел бы оставить этот ответ как есть;-)
Мартин
3
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
источник
1

При использовании вместе с необязательным (нестандартным) атрибутом ZEROFILL заполнение пробелов по умолчанию заменяется нулями. Например, для столбца, объявленного как INT (4) ZEROFILL, значение 5 извлекается как 0005.

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

Даниэль Кутик
источник
ссылка будет dev.mysql.com/doc/refman/5.0/en/numeric-type-attributes.html вместо этого
архак
1

Если вы указываете ZEROFILL для числового столбца, MySQL автоматически добавляет атрибут UNSIGNED в столбец.

Числовые типы данных, которые разрешают атрибут UNSIGNED, также разрешают SIGNED. Однако эти типы данных подписаны по умолчанию, поэтому атрибут SIGNED не имеет никакого эффекта.

Приведенное выше описание взято с официального сайта MYSQL.

Adeel
источник
0

ZEROFILL

По сути, это означает, что если целое значение 23 будет вставлено в столбец INT с шириной 8, тогда оставшаяся часть доступной позиции будет автоматически дополнена нулями.

следовательно

23

будет выглядеть так:

00000023
Саймон Х
источник