MySQL'de tinyint, smallint, mediumint, bigint ve int arasındaki fark nedir?


368

MySQL'de tinyint, smallint, mediumint, bigint ve int arasındaki fark nedir?

Hangi durumlarda bunlar kullanılmalıdır?

Yanıtlar:


575

Farklı miktarlarda yer kaplarlar ve farklı kabul edilebilir değer aralıklarına sahiptirler.

SQL Server için boyutlar ve değer aralıkları şunlardır , diğer RDBMS'ler benzer belgelere sahiptir:

Hepsi aynı spesifikasyonu kullandıkları ortaya çıktı (aşağıda belirtilen birkaç küçük istisna dışında), ancak bu türlerin çeşitli kombinasyonlarını destekliyor (Oracle sadece bir NUMBERveri türüne sahip olduğu için dahil edilmedi , yukarıdaki bağlantıya bakın):

             | 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

Ve aynı değer aralıklarını (aşağıda bir istisna dışında) desteklerler ve hepsi aynı depolama gereksinimlerine sahiptir:

            | 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 

"İmzasız" türler yalnızca MySQL'de mevcuttur ve geri kalanı sadece bir istisna dışında imzalı aralıkları kullanır: tinyintSQL Server'da imzasız ve 0 ila 255 arasında bir değer aralığı var


21
İmzasız türlerin sadece MySQL'de mevcut olduğunu bilmiyordum, bu MySQL'in diğer RDBMS'ye göre büyük bir avantajı. Bu cevabın yayınlandığı günden bu yana bir şey değişti mi?
biox

3
@Daniel, Ne düşünüyorlar, neden 3 bayt için bir tane var ama 6 bayt için hiçbiri yok?
Pacerier

10
@Pacerier muhtemelen nasıl adlandırılacağını bilmiyordu :))
Mihai Matei

5
Onlar aramalıydın o bir humongousint, bir büyük tamsayı ve yerine bigint.
MarioDS

5
greatint bir seçenek olabilir ve Oracle bir ABD şirketi olabilir. :)
osiris

32

gereken depolama alanı boyutu ve sayıların ne kadar büyük olabileceği

SQL Server'da

tinyint 1 bayt, 0 ila 255

smallint 2 bayt, -2 ^ 15 (-32,768) ila 2 ^ 15-1 (32,767) arası

int 4 bayt, -2 ^ 31 (-2,147,483,648) ila 2 ^ 31-1 (2,147,483,647)

bigint 8 bayt, -2 ^ 63 (-9,223,372,036,854,775,808) ila 2 ^ 63-1 (9,223,372,036,854,775,807)

4 numarayı da 4'te saklayabilirsiniz, ancak bir bigint 8 bayt kullanır, bir tinyint 1 bayt kullanır


15

Bunlar MySQL veri türleri gibi görünüyor.

Aldıkları belgelere göre :

  1. tinyint = 1 bayt
  2. smallint = 2 bayt
  3. mediumint = 3 bayt
  4. int = 4 bayt
  5. bigint = 8 bayt

Ve doğal olarak, giderek daha büyük sayı aralıklarını kabul edin.


9

Bu veri türlerinin gerçek dünya kullanımı söz konusu olduğunda, belirli tamsayı türlerinin kullanılmasının sadece aşırıya kaçması veya az kullanılması gerektiğini anlamanız çok önemlidir. Örneğin, bir tablodaki workerCount için tamsayı veri türünün kullanılması, çalışanın ~ negatif 2 milyar ila pozitif 2 milyar veya sıfır ila yaklaşık 4 milyar (imzasız) arasında bir tamsayı değer aralığını desteklediğinden aşırı yük olabileceğini söylüyor. Bu nedenle, yaklaşık 2,2 milyon çalışanı olan ve çalışanCount sütunu için tamsayı veri türü kullanan Walmart gibi ABD'nin en büyük işverenlerinden birini düşünürseniz bile gereksiz olur. Böyle bir durumda, örneğin, orta düzey (0 ila 16 milyon (imzasız) desteği) kullanırsınız. Aralığınızın olağandışı büyük olması bekleniyorsa, Daniel'den görebileceğiniz gibi bigint'i düşünebilirsiniz.


2
2.2 milyon aktif çalışanı olan WalMart örneğinizde - yılda yaklaşık% 50 personel devir hızı ile, Çalışan Kimliği üzerindeki bir INT tipinin gereken minimum değer olacağını düşünüyorum. Ne düşünüyorsun? Verildi - ÇOK normal şirketler için bir INT türü YOL aşırıya kaçabilir!
kiltannen

3

Fark, her bir tamsayıya ayrılan bellek miktarı ve her birinin ne kadar büyük bir sayı depolayabileceğidir.


2

Veri türü Aralık Depolama

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

Misal

Aşağıdaki örnek, bigint, int, smallint ve tinyint veri türlerini kullanarak bir tablo oluşturur. Değerler her sütuna eklenir ve SELECT deyiminde döndürülür.

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.