ขนาดของคอลัมน์ของ int (11) ใน mysql หน่วยเป็นไบต์?


488

ขนาดของคอลัมน์int(11)ใน mysql เป็นไบต์เท่าไหร่?

และค่าสูงสุดที่สามารถเก็บไว้ในคอลัมน์นี้ได้หรือไม่


1
มีความซ้ำซ้อนของSQL Int (N) ขนาดเท่าไหร่?
cellepo

1
@cellepo อันหนึ่งเป็น sql ทั่วไปส่วนอีกอันนั้นเฉพาะสำหรับ mysql (บวกอันนี้มีมุมมองเพิ่มเติม) หากคุณต้องการไปล่าเหยื่อและให้ฉันปิดพวกเขาอย่างรวดเร็วด้วยการโหวตหนึ่งครั้งให้ไปที่การแชทของSOBoticsและ ping ฉัน แต่ต้องปิดแท็กmysqlก่อนที่ฉันจะมาถึง ขอบคุณ
ดึง

6
ไงพวก. มันอาจจะซ้ำกัน แต่มันเป็นมิตรกับการค้นหามากกว่า คนส่วนใหญ่ค้นหาเช่นนี้โดยใช้ int (11) และมันกำลังแก้ไขคำถามของคนอื่น คุณสามารถตรวจสอบจำนวนการดูเปรียบเทียบกับมุมมองอื่น และผู้ใช้จะพบคำตอบโดยละเอียดเพิ่มเติมได้ที่นี่
Gaurav

คำตอบ:


685

INTจะเป็น 4 ไบต์ว่าสิ่งที่ระยะเวลาที่ระบุไว้ไม่มี

  • TINYINT = 1 ไบต์ (8 บิต)
  • SMALLINT = 2 ไบต์ (16 บิต)
  • MEDIUMINT = 3 ไบต์ (24 บิต)
  • INT = 4 ไบต์ (32 บิต)
  • BIGINT = 8 ไบต์ (64 บิต)

ความยาวเพียงระบุจำนวนอักขระที่จะแพดเมื่อเลือกข้อมูลด้วยไคลเอนต์บรรทัดคำสั่ง mysql 12345 เก็บไว้ตามที่int(3)จะยังคงแสดงเป็น 12345 แต่ถ้ามันถูกเก็บไว้int(10)ก็จะยังคงแสดงเป็น 12345 แต่คุณจะมีตัวเลือกในการรองตัวเลขห้าหลักแรก ตัวอย่างเช่นถ้าคุณเพิ่มZEROFILLมันจะแสดงเป็น 0000012345

... และค่าสูงสุดจะเป็น 2147483647 (ลงชื่อ) หรือ 4294967295 (ไม่ได้ลงชื่อ)


111
ดังนั้นความหมายของ 11 ใน int (11) ตรงนี้คืออะไร
Gaurav

73
คอลัมน์ INT (4), จำนวนเต็ม 1 จะแสดงเป็น 0001 เท่านั้นหากคอลัมน์นั้นถูกระบุเป็น zerofill ด้วย มิฉะนั้นจะปรากฏเป็นหมายเลข 1 โดยไม่มีตัวเลขพิเศษ @Gaurav - อย่าผสมผสานวิธีที่ mysql แสดงข้อมูลและวิธีจัดเก็บข้อมูลเหล่านั้นเป็นสองสิ่งที่ต่างกัน สิ่งที่คุณเห็นไม่ใช่สิ่งที่อาจเป็นจริง
Michael JV

13
@Michael Wow น่าสนใจจริงๆ ดังนั้นถ้าคุณสร้างคอลัมน์ INT (3) และเก็บค่า 5001 มันจะเก็บ 5001 แต่แสดงเฉพาะ 1 ฉันไม่ทราบว่า
andrewtweber

16
@andrewtweber: 5001จะแสดงเป็นแม้ว่าข้อมูลถูกกำหนดให้เป็น5001 INT(3)ดู @priyabagus คำตอบด้านล่างและที่นี่
go2null

10
คุณไม่ได้ให้ความยาวสำหรับฟิลด์จำนวนเต็ม MySQL จะตั้งค่าเริ่มต้น (tinyint 4, smallint 6, Mediumint 9, int 11, bigint 20) คุณควรทราบว่าความยาวเริ่มต้นเหล่านี้เพียงพอที่จะแสดงตัวเลขใด ๆ ที่ สามารถเก็บไว้ในฟิลด์นี้ (เช่นค่าสูงสุดเล็ก ๆ คือ 2 ^ 16 = 65536, 5 หลัก) เว้นแต่คุณจะมีเหตุผลที่ดีที่จะทำอย่างอื่นฉันขอแนะนำให้เว้นขนาดเริ่มต้นเพื่อหลีกเลี่ยงความประหลาดใจที่ไม่ดี
Thibault Witzig

167

INT ( x )จะสร้างความแตกต่างเฉพาะในรูปแบบของการแสดงผลนั่นคือการแสดงตัวเลขเป็นตัวเลขxและไม่ จำกัด ที่ 11 คุณจับคู่โดยใช้ZEROFILLซึ่งจะเติมศูนย์ให้ตรงกับความยาวของคุณ

ดังนั้นสำหรับหมายเลขใด ๆ ของxในINT(x)

  • ถ้าค่าที่เก็บไว้มีตัวเลขน้อยกว่าx , ZEROFILLจะย่อหน้าศูนย์

    INT (5) ZEROFILL ที่มีค่าที่เก็บไว้ 32 จะแสดง00032
    INT (5) ที่มีค่าที่เก็บไว้ของ 32 จะแสดง32
    INT ที่มีค่าที่เก็บไว้ของ 32 จะแสดง32

  • หากค่าที่เก็บไว้มีตัวเลขมากกว่าxมันจะแสดงตามที่เป็นอยู่

    INT (3) ZEROFILL ที่มีค่าที่เก็บไว้ 250000 จะแสดง250000
    INT (3) ที่มีค่าที่เก็บไว้ของ 250000 จะแสดง250000
    INTด้วยค่าที่เก็บไว้ของ 250000 จะแสดง250000

ค่าจริงที่เก็บไว้ในฐานข้อมูลจะไม่ได้รับผลกระทบขนาดยังคงเหมือนเดิมและการคำนวณใด ๆ จะทำงานตามปกติ

นอกจากนี้ยังใช้กับ BIGINT, MEDIUMINT, SMALLINT และ TINYINT


49
ดังนั้นความยาวจึงไม่ทำอะไรเลยเว้นแต่คุณจะใช้ซีโรฟิลล์?
developerbmw

29
@developerbmw - ถูกต้อง ZEROFILLความยาวไม่ทำอะไรเลยอย่างแน่นอนเว้นแต่คุณจะใช้
Rick James

ZEROFILL เป็นโหมดการทำงานร่วมกับเมนเฟรมเป็นหลัก
Henk Poley

114

ตามที่นี่ , int(11)จะใช้เวลา 4 ไบต์ของพื้นที่ที่เป็น 32 บิตของพื้นที่ที่มี 2^(31) = 2147483648ค่าสูงสุดและ-2147483648ค่าต่ำสุด หนึ่งบิตสำหรับการลงชื่อเข้าใช้


1
ตัวอย่างของคุณมี 9 เก้า คุณกรุณายืนยันได้ว่าตัวอย่างของคุณถูกต้องหรือไม่? ถ้าเป็นเช่นนั้นทำไมมันบอกว่า 10 เมื่อมีเก้าเก้า? เป็นจำนวนหลักบวกหนึ่งบวกอักขระเครื่องหมายหรือไม่
Homer6

5
ไม่จำนวนสูงสุดคือ 4294967295 ถ้า int ที่ไม่ได้ลงชื่อคือ 2 ^ 32 หมายเลขในวงเล็บไม่ส่งผลต่อประเภทการจัดเก็บ หากคุณต้องการมากกว่า 2 ^ 32 คุณต้องไปที่ใหญ่
Kieran Tully

7
หรือค่อนข้าง (2 ^ 32) -1
Kieran Tully

2
+ Kieran ถูกต้อง จำนวนสูงสุดแตกต่างจากในคำตอบ ดูที่นี่
daviewales

38

ดังที่คนอื่น ๆ พูดไว้ค่า minumum / สูงสุดที่คอลัมน์สามารถจัดเก็บได้และจำนวนหน่วยความจำที่ใช้ในหน่วยไบต์จะถูกกำหนดโดยประเภทเท่านั้นไม่ใช่ความยาว

คำตอบเหล่านี้บอกว่า(11)ส่วนหนึ่งมีผลต่อความกว้างของการแสดงผลซึ่งไม่เป็นความจริง แต่ส่วนใหญ่แล้ว

ความหมายของint(2)กับzerofill ไม่ระบุจะ:

  • ยังคงยอมรับค่าของ 100
  • ยังคงแสดงค่า100เมื่อเอาท์พุท (ไม่0หรือ00)
  • ความกว้างของจอแสดงผลจะเป็นความกว้างของการเป็นผลผลิตที่คุ้มค่าที่ใหญ่ที่สุดจากแบบสอบถามที่เลือก

สิ่งเดียวที่(2)จะทำคือถ้ามีการระบุ zerofill ด้วย :

  • ค่าจะแสดง101
  • เมื่อแสดงค่าคอลัมน์จะมีความกว้างของค่าที่เป็นไปได้สูงสุดที่คอลัมน์สามารถใช้ซึ่งคือ 10 หลักสำหรับจำนวนเต็มแทนความกว้าง miniumum ที่ต้องการเพื่อแสดงค่าที่ใหญ่ที่สุดที่คอลัมน์นั้นจำเป็นต้องแสดงในแบบสอบถามแบบใช้เลือกนั้น ซึ่งอาจมีขนาดเล็กกว่ามาก
  • คอลัมน์ยังคงสามารถรับและแสดงค่าเกินความยาว แต่ค่าเหล่านี้จะไม่ถูกนำหน้าด้วย 0s

วิธีที่ดีที่สุดในการดูความแตกต่างทั้งหมดคือการเรียกใช้:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

ซึ่งจะเอาท์พุท:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

คำตอบนี้ทดสอบกับ MySQL 5.7.12 สำหรับ Linux และอาจแตกต่างกันไปสำหรับการใช้งานอื่น ๆ


5
"สังเกตว่าคอลัมน์ int1 มีความกว้างของการแสดงผลที่เล็กกว่า zerofill2 แม้ว่าความยาวจะใหญ่กว่า" ... เอ๊ะนั่นเป็นเพราะชื่อคอลัมน์ 'zerofill2' คือ 9 chars long vs 'int1' ที่มี 4
neokio

2
... ใช่ดังนั้นความยาวอย่างชัดเจนจึงไม่มีผลกระทบแม้แต่ในความกว้างของหน้าจอเมื่อไม่ได้เปิดใช้งานซีโรฟิลล์ มิฉะนั้น int1 จะกว้างขึ้นมากโดยมีความกว้าง 10 อักขระแทน
Programster

2
คำอธิบายที่ดีพร้อมตัวอย่างที่มั่นคง วิธีที่ดีกว่าคำตอบที่ยอมรับได้ ขอบคุณ @Programster
Corin

ผู้เยาว์เล็กน้อย: ตามที่ neokio ชี้ให้เห็นไม่สามารถสังเกตจากผลการค้นหาที่แน่นอนของ "int (3)" โดยไม่มีการเติม ย่อชื่อคอลัมน์เป็น "zf2" เพื่อทำให้การทำงานชัดเจนขึ้น โดยเฉพาะอย่างยิ่งไม่ว่าจะเป็นจริงหรือเท็จ [ในรุ่นฐานข้อมูลที่กำหนด] ว่า "(พร้อม zerofill) เมื่อแสดงค่าคอลัมน์จะมีความกว้างของค่าสูงสุดที่เป็นไปได้เสมอที่คอลัมน์อาจใช้ซึ่งเป็นตัวเลข 10 หลักสำหรับจำนวนเต็ม"
ToolmakerSteve

1
เพื่อชี้แจงความคิดเห็นของ neokio และความคิดเห็นเล็กน้อยของฉัน: ประโยค"สังเกตว่าคอลัมน์ int1 มีความกว้างของการแสดงผลที่เล็กกว่า zerofill2 แม้ว่าความยาวจะใหญ่กว่านี้" ควรลบออกจากคำตอบ นั่นเป็นผลมาจากจำนวนตัวอักษรในคำส่วนหัว "zerofill2" - มันไม่มีส่วนเกี่ยวข้องกับการทดสอบความกว้างของจอแสดงผล ควรตั้งชื่อให้สั้นกว่าคอลัมน์เช่น "zf2" จากนั้นเราจะมีตารางที่ "int1, int2 และ zf2 ล้วนมีความกว้างเท่ากันทุกประการแม้ว่า int2 และ zf2 จะระบุความกว้างขนาดเล็ก (3)"
ToolmakerSteve

32

ขนาดของคอลัมน์ของ int (11) ใน mysql หน่วยเป็นไบต์?

(11)- คุณลักษณะintประเภทข้อมูลนี้ไม่มีอะไรเกี่ยวข้องกับขนาดของคอลัมน์ มันเป็นเพียงความกว้างในการแสดงผลของชนิดข้อมูลจำนวนเต็ม จาก11.1.4.5 คุณสมบัติประเภทตัวเลข :

MySQL รองรับส่วนขยายสำหรับทางเลือกในการระบุความกว้างในการแสดงผลของชนิดข้อมูลจำนวนเต็มในวงเล็บตามด้วยคำหลักพื้นฐานสำหรับประเภท ตัวอย่างเช่น INT (4) ระบุ INT ที่มีความกว้างของการแสดงผลสี่หลัก


19

คำอธิบายที่ดีสำหรับสิ่งนี้สามารถพบได้ที่นี่

เพื่อสรุป: จำนวน N ใน int (N) มักจะสับสนโดยขนาดสูงสุดที่อนุญาตสำหรับคอลัมน์เช่นเดียวกับในกรณีของ varchar (N)

แต่นี่ไม่ใช่กรณีที่มีชนิดข้อมูลจำนวนเต็ม - หมายเลข N ในวงเล็บไม่ใช่ขนาดสูงสุดของคอลัมน์ แต่เพียงพารามิเตอร์ที่จะบอก MySQL ว่าความกว้างในการแสดงคอลัมน์เมื่อข้อมูลของตารางถูกดูผ่าน MySQL คอนโซล (เมื่อคุณใช้แอตทริบิวต์ ZEROFILL)

จำนวนในวงเล็บจะบอก MySQL ว่ามีกี่ศูนย์ที่จะปัดจำนวนเต็มเข้า ตัวอย่างเช่น: หากคุณใช้ ZEROFILL ในคอลัมน์ที่ตั้งค่าเป็น INT (5) และใส่หมายเลข 78, MySQL จะตัดค่านั้นด้วยค่าศูนย์จนกระทั่งตัวเลขเป็นไปตามตัวเลขในวงเล็บ เช่น 78 จะกลายเป็น 00078 และ 127 จะกลายเป็น 00127 หากต้องการสรุป: จำนวนในวงเล็บใช้สำหรับการแสดงผล
ในทางกลับกันตัวเลขในวงเล็บนั้นไม่มีประโยชน์เว้นแต่คุณจะใช้แอตทริบิวต์ ZEROFILL

ดังนั้นขนาดของ int จะยังคงเหมือนเดิมคือ-2147483648 ถึง 2147483648 สำหรับการเซ็นชื่อและ 0 ถึง 4294967295 สำหรับผู้ที่ไม่ได้ลงชื่อ(~ 2.15 พันล้านและ 4.2 พันล้านซึ่งเป็นหนึ่งในเหตุผลที่นักพัฒนายังไม่รู้เรื่องหลังตัวเลข N ในวงเล็บเนื่องจากแทบจะไม่ส่งผลกระทบต่อฐานข้อมูลเว้นแต่จะมีมากกว่า 2 พันล้านแถว) และในแง่ของไบต์ จะเป็น4 ไบต์

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับขนาด / พิสัยของ Integer โปรดดูที่คู่มือ MySQL


ทำไมจำนวนแถวเข้ามาเล่นที่นี่?
แก่เก่า

@OldGeezer - ยอมรับ "จำนวนแถว" ไม่เกี่ยวข้องกับคอลัมน์ส่วนใหญ่ เฉพาะที่เกี่ยวข้องกับคอลัมน์คีย์หลัก (id) ที่เพิ่มขึ้นอัตโนมัติ
ToolmakerSteve

10

แม้ว่าคำตอบนี้ไม่น่าจะเห็น แต่ฉันคิดว่าคำอธิบายต่อไปนี้ควรค่าแก่การทำ:

  • (n) ด้านหลังชนิดข้อมูลจำนวนเต็มใน MySQL กำลังระบุความกว้างของการแสดงผล
  • ความกว้างของจอแสดงผลไม่ได้จำกัดความยาวของจำนวนที่ส่งคืนจากแบบสอบถาม
  • ความกว้างของจอแสดงผล จำกัด จำนวนของศูนย์ที่เติมสำหรับคอลัมน์ที่เติมศูนย์ดังนั้นจำนวนทั้งหมดจะตรงกับความกว้างของจอแสดงผล (ตราบใดที่จำนวนจริงไม่เกินความกว้างของจอแสดงผลในกรณีนี้หมายเลขจะแสดงตามที่เป็น)
  • ความกว้างของการแสดงผลนั้นมีไว้เพื่อเป็นเครื่องมือที่มีประโยชน์สำหรับนักพัฒนาในการทราบความยาวของค่าที่ควรเพิ่ม


เห็นได้ชัดว่าBIT OF DETAILความกว้างของการแสดงผลนั้นมีจุดประสงค์เพื่อให้ข้อมูลเมตาเกี่ยวกับจำนวนศูนย์ที่จะแสดงในจำนวนที่เติมศูนย์
ไม่ได้จำกัดความยาวของตัวเลขที่ถูกส่งคืนจากเคียวรีหากจำนวนนั้นสูงกว่าความกว้างของจอแสดงผลที่ระบุ
หากต้องการทราบว่ามีความยาว / ความกว้างเท่าใดที่อนุญาตให้ใช้จริงสำหรับชนิดข้อมูลจำนวนเต็มใน MySQL ดูรายการ & ลิงค์: ( ประเภท: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
ดังนั้นเมื่อกล่าวไว้ข้างต้นคุณสามารถคาดหวังความกว้างของจอแสดงผลที่จะไม่มีผลกับผลลัพธ์จากแบบสอบถามมาตรฐานเว้นแต่คอลัมน์จะถูกระบุเป็นคอลัมน์ ZEROFILL
หรือ
ในกรณีที่ข้อมูลถูกดึงเข้าสู่แอปพลิเคชัน & แอปพลิเคชันนั้นกำลังรวบรวม ความกว้างของจอแสดงผลที่จะใช้สำหรับการรองแบบอื่น

ข้อมูลอ้างอิงหลัก: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean


ขอบคุณที่ให้คำตอบที่เหมาะสม ฉันพยายามจากบรรทัดคำสั่ง MySQL และฉันไม่สามารถทำให้ตัวเลขใด ๆ หลุดออกมาได้ด้วยขนาดเล็กnดังนั้น ... ใช่แล้วนั่นเป็นเรื่องจริง มันทำอะไรกับ zerofill เท่านั้น
mpen

@mpen ดีใจที่ฉันสามารถช่วยได้นี่คือสิ่งที่เกี่ยวข้องกับสิ่งที่ฉันพยายามและคิดว่าฉันสามารถใส่รายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่ซึ่งอาจเป็นประโยชน์กับคนอื่น
MER

9

ในจำนวนเต็ม MySQL int(11)มีขนาดคือ 4 ไบต์ซึ่งเท่ากับ 32 บิต

ค่าที่ลงนามคือ: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

ค่าที่ไม่ได้ลงชื่อคือ: 0 to 2^32-1 = 0 to 4294967295


0

ตามหนังสือเล่มนี้:

MySQL ช่วยให้คุณระบุ“ ความกว้าง” สำหรับประเภทจำนวนเต็มเช่น INT (11) สิ่งนี้ไม่มีความหมายสำหรับแอพพลิเคชั่นส่วนใหญ่: ไม่ จำกัด ขอบเขตทางกฎหมาย แต่เพียงระบุจำนวนตัวอักษรเครื่องมือโต้ตอบของ MySQL ที่จะสำรองไว้เพื่อการแสดงผล สำหรับการจัดเก็บและวัตถุประสงค์ในการคำนวณ INT (1) จะเหมือนกับ INT (20)



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