Яка користь від заповнення нуля в MySQL?


168

Я просто хочу знати , що користь / використання визначення ZEROFILLдля INTТіпДанних в MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 


Гарне питання. Пов’язані питання, які також можна задати: Чи є вагомі причини не використовувати 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виглядає дивно.

Для того , щоб зберігати ці дані, ви можете використовувати VARCHAR(5)або в INT(5) ZEROFILLтой час як zerofilled ціле має дві великі переваги:

  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). Null не завжди означає False, іноді цього не хочеться. Здійснюючи нульове заповнення крихітного відтінку, ви ефективно перетворюєте ці значення в INT і видаляєте будь-яку плутанину ур-програми при взаємодії. Тоді ваша програма може обробляти ці значення таким же чином, як і примітивний тип даних True = Не (0)


1
Дякую, але, на жаль, я просто запустив кілька тестів на mysql db, і він не заповнить нульові значення: - /. Ця мета досі досягається обмеженням поля, щоб не допустити нуль. Я повинен знати краще, ніж намагатися відповідати на запитання про dbs, які я зазвичай не використовую. Видаліть мою відповідь, перш ніж люди будуть надто задоволені. lol
Marlin

1
Корисно? Це неправильно. Zerofill нічого не робить (крім додавання Непідписаний), коли довжина дисплея дорівнює 1.
Brilliand

@Marlin, і ви завжди повинні встановлювати значення за замовчуванням для true або false ... якщо ви не використовуєте значення за замовчуванням, тоді згадана вами проблема НЕ буде єдиною ... НЕ 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)

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/uk/numeric-type-attributes.html замість цього
arhak

1

Якщо ви вказали ZEROFILL для числового стовпця, MySQL автоматично додає атрибут UNSIGNED до стовпця.

Числові типи даних, які дозволяють атрибут UNSIGNED, також дозволяють ПІДПИСАТИ. Однак ці типи даних підписуються за замовчуванням, тому атрибут SIGNED не має ефекту.

Вищеописаний опис взято з офіційного веб-сайту MYSQL.


0

ZEROFILL

Це по суті означає, що якщо ціле значення 23 вставити в колонку INT шириною 8, то решта доступної позиції буде автоматично зафіксована нулями.

Звідси

23

стає:

00000023
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.