ประโยชน์ของซีโรฟิลล์ใน MySQL คืออะไร?


168

ผมแค่อยากจะรู้ว่าสิ่งที่เป็นประโยชน์ / การใช้งานของการกำหนดZEROFILLสำหรับINTชนิดข้อมูลในMySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 


คำถามที่ดี. คำถามที่เกี่ยวข้องที่อาจถูกถาม: มีเหตุผลที่ดีที่จะไม่ใช้ ZEROFILL หรือไม่ ข้อเสียและข้อผิดพลาดที่อาจเกิดขึ้นจากการใช้ ZEROFILL คืออะไร ผลประโยชน์มีมากกว่าข้อเสียหรือไม่
spencer7593

ดูคำอธิบายstackoverflow.com/questions/5634104/…
priyabagus

คำตอบ:


254

เมื่อคุณเลือกคอลัมน์ที่มีประเภทZEROFILLมันจะวางค่าที่แสดงของฟิลด์ด้วยค่าศูนย์จนถึงความกว้างของจอแสดงผลที่ระบุในคำจำกัดความของคอลัมน์ ค่าที่ยาวกว่าความกว้างหน้าจอจะไม่ถูกตัดทอน หมายเหตุ: การใช้งานที่ยังหมายถึงZEROFILLUNSIGNED

การใช้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
Mark Byers

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 มันยังคงเป็นแนวทางที่ถูกต้อง แต่สำหรับกรณีที่หายาก
Phil

61

มันเป็นคุณสมบัติสำหรับคนที่มีบุคลิกที่ชอบรบกวนกล่องสี่เหลี่ยม

คุณใส่

1
23
123 

แต่เมื่อคุณเลือกมันจะเสริมค่า

000001
000023
000123

15

ช่วยในการเรียงลำดับที่ถูกต้องในกรณีที่คุณจะต้องเชื่อมต่อ "จำนวนเต็ม" นี้กับสิ่งอื่น (ตัวเลขหรือข้อความอื่น) ซึ่งจะต้องเรียงลำดับเป็น "ข้อความ" จากนั้น

ตัวอย่างเช่น,

ถ้าคุณจะต้องใช้หมายเลขฟิลด์จำนวนเต็ม (สมมติว่า 5) ตัดแบ่งเป็น A-005 หรือ 10/0005


4

ฉันรู้ว่าฉันมาปาร์ตี้ช้า แต่ฉันพบว่าซีโรฟิลล์มีประโยชน์สำหรับการเป็นตัวแทนบูลีนของ TINYINT (1) Null ไม่ได้หมายถึงเท็จเสมอไปบางครั้งคุณไม่ต้องการมัน คุณสามารถแปลงค่าเหล่านั้นให้เป็น INT ได้อย่างมีประสิทธิภาพและลบแอปพลิเคชันของคุณออกจากความสับสนที่อาจเกิดขึ้นจากการโต้ตอบ แอปพลิเคชันของคุณสามารถจัดการค่าเหล่านั้นในลักษณะที่คล้ายคลึงกับประเภทข้อมูลดั้งเดิม True = Not (0)


1
ขอบคุณ แต่น่าเสียดายที่ฉันเพิ่งทำการทดสอบกับ mysql db และมันไม่ได้เป็นค่าศูนย์ zerofill: - / เป้าหมายนั้นยังคงทำได้โดยการบังคับให้เขตข้อมูลไม่อนุญาตให้มีค่าว่าง ฉันควรจะรู้ดีกว่าที่จะลองตอบคำถามเกี่ยวกับดีบีเอสที่ฉันไม่ได้ใช้ จะลบคำตอบของฉันก่อนที่ผู้คนจะลงมามีความสุขมากเกินไป lol
Marlin

1
มีประโยชน์หรือไม่ มันไม่ถูกต้อง Zerofill ไม่ทำอะไรเลย (ยกเว้นเพิ่ม Unsigned) เมื่อความยาวหน้าจอคือ 1
Brilliand

@Marlin และคุณควรตั้งค่าเริ่มต้นสำหรับจริงหรือเท็จ ... หากคุณไม่ได้ใช้ค่าเริ่มต้นปัญหาที่คุณกล่าวถึงจะไม่เป็นคนเดียว ... NOT NULL ก็เป็นสิ่งที่ดีเช่นกัน :)
bakriawad

ฉันจะลงคะแนน แต่ตัวแทนของคุณอยู่ที่666ดังนั้นฉันต้องการที่จะให้คำตอบนี้เป็น;-)
Martin

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/th/numeric-type-attributes.htmlแทน
arhak

1

หากคุณระบุ ZEROFILL สำหรับคอลัมน์ตัวเลข MySQL จะเพิ่มแอตทริบิวต์ UNSIGNED ลงในคอลัมน์โดยอัตโนมัติ

ชนิดข้อมูลตัวเลขที่อนุญาตให้ใช้คุณลักษณะ UNSIGNED ยังอนุญาตให้ลงชื่อ อย่างไรก็ตามชนิดข้อมูลเหล่านี้มีการลงชื่อโดยค่าเริ่มต้นดังนั้นแอตทริบิวต์ SIGNED จึงไม่มีผลกระทบใด ๆ

คำอธิบายข้างต้นนำมาจากเว็บไซต์อย่างเป็นทางการของ MYSQL


0

ZEROFILL

นี่หมายความว่าถ้าค่าจำนวนเต็ม 23 ถูกแทรกลงในคอลัมน์ INT ที่มีความกว้าง 8 ดังนั้นตำแหน่งที่เหลือจะถูกเติมด้วยศูนย์โดยอัตโนมัติ

ด้วยเหตุนี้

23

กลายเป็น:

00000023
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.