อะไรคือความแตกต่างระหว่างจิ๋วจิ้นเล็กจิ้นทินทินทินท์อินใหญ่และ int ใน MySQL?


368

อะไรคือความแตกต่างระหว่างจิ๋วจิ้นเล็กจิ้นทินทินทินท์อินใหญ่และ int ใน MySQL?

ควรใช้สิ่งเหล่านี้ในกรณีใด

คำตอบ:


575

พวกเขาใช้พื้นที่ในปริมาณที่แตกต่างกันและมีช่วงของค่าที่ยอมรับได้แตกต่างกัน

นี่คือขนาดและช่วงของค่าสำหรับ SQL Server , RDBMS อื่น ๆ มีเอกสารที่คล้ายกัน:

  • MySQL
  • Postgres
  • Oracle (พวกเขามีNUMBERประเภทข้อมูลจริงๆ)
  • DB2

ปรากฎว่าพวกเขาทุกคนใช้สเปคเดียวกัน (ยกเว้นข้อยกเว้นเล็กน้อยที่ระบุไว้ด้านล่าง) แต่สนับสนุนชุดค่าผสมต่าง ๆ ของประเภทเหล่านั้น (ไม่รวม Oracle เนื่องจากมีเพียงNUMBERประเภทข้อมูลให้ดูที่ลิงค์ด้านบน):

             | SQL Server    MySQL   Postgres    DB2
---------------------------------------------------
tinyint      |     X           X                
smallint     |     X           X         X        X
mediumint    |                 X
int/integer  |     X           X         X        X 
bigint       |     X           X         X        X

และรองรับช่วงค่าเดียวกัน (โดยมีข้อยกเว้นหนึ่งข้อด้านล่าง) และทั้งหมดมีข้อกำหนดด้านพื้นที่เก็บข้อมูลเหมือนกัน:

            | Bytes    Range (signed)                               Range (unsigned)
--------------------------------------------------------------------------------------------
tinyint     | 1 byte   -128 to 127                                  0 to 255
smallint    | 2 bytes  -32768 to 32767                              0 to 65535
mediumint   | 3 bytes  -8388608 to 8388607                          0 to 16777215
int/integer | 4 bytes  -2147483648 to 2147483647                    0 to 4294967295
bigint      | 8 bytes  -9223372036854775808 to 9223372036854775807  0 to 18446744073709551615 

ประเภท "unsigned" นั้นมีเฉพาะใน MySQL และส่วนที่เหลือก็ใช้ช่วงที่มีการเซ็นชื่อด้วยข้อยกเว้นที่น่าสังเกตหนึ่งประการ: tinyintใน SQL Server นั้นไม่ได้ลงนามและมีช่วงค่าตั้งแต่ 0 ถึง 255


21
ฉันไม่รู้ว่าประเภทที่ไม่ได้ลงนามนั้นมีเฉพาะใน MySQL นี่เป็นข้อได้เปรียบอย่างมากของ MySQL มากกว่า RDBMS อื่น ๆ มีอะไรเปลี่ยนแปลงตั้งแต่วันที่คำตอบนี้โพสต์?
biox

3
@Daniel พวกเขาคิดอะไรอยู่ทำไมถึงมี 3 ไบต์ แต่ไม่มี 6 ไบต์ล่ะ?
Pacerier

9
@Pierier พวกเขาอาจไม่รู้วิธีตั้งชื่อ :))
Mihai Matei

5
พวกเขาควรจะเรียกมันว่า bigint และแทนที่จะเป็น bigint เป็น humongousint
MarioDS

5
greatint อาจเป็นตัวเลือกเนื่องจาก Oracle เป็น บริษัท ในสหรัฐอเมริกา :)
โอซิริส

32

ขนาดของพื้นที่เก็บข้อมูลที่ต้องการและขนาดของตัวเลขสามารถเป็นเท่าใด

บน SQL Server

tinyint 1 ไบต์, 0 ถึง 255

smallint 2 ไบต์, -2 ^ 15 (-32,768) ถึง 2 ^ 15-1 (32,767)

int 4 ไบต์, -2 ^ 31 (-2,147,483,648) ถึง 2 ^ 31-1 (2,147,483,647)

bigint 8 ไบต์, -2 ^ 63 (-9,223,372,036,854,775,808) ถึง 2 ^ 63-1 (9,223,372,036,854,775,807)

คุณสามารถจัดเก็บหมายเลข 1 ในทั้ง 4 แต่ bigint จะใช้ 8 ไบต์ในขณะที่ smallint จะใช้ 1 ไบต์


15

ดูเหมือนจะเป็นชนิดข้อมูล MySQL

ตามเอกสารที่ใช้:

  1. tinyint = 1 ไบต์
  2. smallint = 2 ไบต์
  3. mediumint = 3 ไบต์
  4. int = 4 ไบต์
  5. bigint = 8 ไบต์

และยอมรับจำนวนช่วงที่กว้างขึ้น


9

เมื่อได้รับการใช้งานจริงของประเภทข้อมูลเหล่านี้เป็นสิ่งสำคัญมากที่คุณเข้าใจว่าการใช้จำนวนเต็มบางประเภทอาจเป็นการ overkill หรือภายใต้การใช้งาน ตัวอย่างเช่นการใช้ประเภทข้อมูลจำนวนเต็มสำหรับ employeeCount ในตารางบอกว่าพนักงานอาจ overkill เนื่องจากสนับสนุนช่วงของค่าจำนวนเต็มตั้งแต่ ~ ลบ 2 พันล้านถึงบวก 2 พันล้านหรือศูนย์ถึงประมาณ 4 พันล้าน (ไม่ได้ลงนาม) ดังนั้นแม้ว่าคุณจะพิจารณาหนึ่งในนายจ้างที่ใหญ่ที่สุดในสหรัฐเช่น Walmart ที่มีพนักงานประมาณ 2.2 ล้านคนที่ใช้ประเภทข้อมูลจำนวนเต็มสำหรับคอลัมน์ employeeCount จะไม่จำเป็น ในกรณีเช่นนี้คุณใช้สื่อกลาง (ที่รองรับตั้งแต่ 0 ถึง 16 ล้าน (ไม่ได้ลงนาม)) ต้องบอกว่าถ้าช่วงของคุณคาดว่าจะมีขนาดใหญ่ผิดปกติคุณอาจพิจารณาใหญ่ที่คุณสามารถดูได้จากแดเนียล


2
ในตัวอย่างของ WalMart ที่มีพนักงานที่ทำงานอยู่ 2.2 ล้านคน - ฉันคิดว่าด้วยการหมุนเวียนพนักงานประมาณ 50% ต่อปีว่าประเภท INT บน EmployeeID จะเป็นขั้นต่ำที่จำเป็น คุณจะคิดอย่างไร ได้รับ - สำหรับ บริษัท ปกติส่วนใหญ่ประเภท INT จะเป็นวิธีที่เกินราคา!
kiltannen

3

ความแตกต่างคือจำนวนหน่วยความจำที่จัดสรรให้กับแต่ละจำนวนเต็มและจำนวนหน่วยความจำที่แต่ละหน่วยสามารถจัดเก็บได้


2

ชนิดข้อมูล Range Storage

bigint  -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)    8 Bytes
int -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)    4 Bytes
smallint    -2^15 (-32,768) to 2^15-1 (32,767)  2 Bytes
tinyint 0 to 255    1 Byte

ตัวอย่าง

ตัวอย่างต่อไปนี้สร้างตารางโดยใช้ชนิดข้อมูล bigint, int, smallint และ tinyint ค่าจะถูกแทรกลงในแต่ละคอลัมน์และส่งคืนในคำสั่ง SELECT

CREATE TABLE dbo.MyTable
(
  MyBigIntColumn bigint
 ,MyIntColumn  int
 ,MySmallIntColumn smallint
 ,MyTinyIntColumn tinyint
);

GO

INSERT INTO dbo.MyTable VALUES (9223372036854775807, 214483647,32767,255);
 GO
SELECT MyBigIntColumn, MyIntColumn, MySmallIntColumn, MyTinyIntColumn
FROM dbo.MyTable;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.