回答:
それらは異なる量のスペースを使用し、許容範囲の値の範囲が異なります。
SQL Serverの値のサイズと範囲は次のとおりです。他のRDBMSにも同様のドキュメントがあります。
それらはすべて同じ仕様を使用しますが(下記のいくつかのマイナーな例外を除く)、それらのタイプのさまざまな組み合わせをサポートします(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
また、それらは同じ値の範囲をサポートし(以下の1つの例外を除く)、すべて同じストレージ要件があります。
| 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
「署名されていない」タイプはMySQLでのみ使用でき、残りは署名された範囲を使用しますが、1つの注目すべき例外tinyint
があります。SQLServerでは、署名されておらず、値の範囲は0〜255です。
必要なストレージのサイズと数がどれほど大きいか
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)
全部で4のうちの1を格納できますが、bigintは8バイトを使用し、tinyintは1バイトを使用します
これらのデータ型の実際の使用法に到達するとき、特定の整数型を使用するのは、やり過ぎまたは不十分に使用される可能性があることを理解することが非常に重要です。たとえば、テーブルでemployeeCountに整数データ型を使用すると、負の20億から正の20億またはゼロから約40億(符号なし)までの整数値の範囲がサポートされるため、従業員はやり過ぎになる可能性があります。したがって、たとえ約220万人の従業員を抱えるWalmartなどの米国最大の雇用主の1人を考えても、employeeCount列に整数データ型を使用する必要はありません。このような場合、たとえば、mediumint(0〜1600万(符号なし)をサポート)を使用します。あなたの範囲が異常に大きいと予想される場合、ダニエルからわかるようにbigintを検討するかもしれないと言った
違いは、各整数に割り当てられたメモリの量と、それぞれが格納できる数値です。
データ型範囲ストレージ
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;