BigInt
、MediumInt
、およびInt
の違いは何だろうと思っていました。ただし、Int(20)
またはBigInt(20)
を作成できますが、それは必ずしもサイズに関するものではないように思われます。
いくつかの洞察は素晴らしいものですが、ちょっと好奇心が強いです。私はMySQLをしばらく使用しており、タイプを選択するときにビジネスニーズを適用しようとしましたが、この側面を理解できませんでした。
http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html を参照してください
INT
は4バイトの符号付き整数です。
BIGINT
は、8バイトの符号付き整数です。
これらはそれぞれ、それぞれのバイト数に格納できる値より多くも少なくも受け入れません。つまり232 INT
および2の値64 BIGINT
の値。
INT(20)
およびBIGINT(20)
の20は、ほとんど何も意味しません。表示幅のヒントです。ストレージとは関係がなく、列が受け入れる値の範囲とも関係ありません。
実際には、ZEROFILL
オプションのみに影響します。
CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;
+----------------------+
| bar |
+----------------------+
| 00000000000000001234 |
+----------------------+
MySQLユーザーがINT(20)
を見て、それがサイズ制限であると仮定することは、CHAR(20)
に類似した混乱の一般的な原因です。これはそうではありません。
型宣言の括弧内の数字はdisplay widthであり、データ型に格納できる値の範囲とは無関係です。 Int(20)
を宣言できるからといって、そこに最大10 ^ 20までの値を格納できるというわけではありません。
[...]このオプションの表示幅は、スペースで左詰めすることで列に指定された幅よりも小さい幅を持つ整数値を表示するためにアプリケーションで使用できます。 ...
表示幅は、列に格納できる値の範囲や、列に指定された幅を超える値を持つ値に表示される桁数を制限しません。たとえば、SMALLINT(3)として指定された列の通常のSMALLINT範囲は-32768〜32767であり、3文字で許可されている範囲外の値は3文字以上を使用して表示されます。
各MySQLデータ型に格納できる最大値と最小値のリストについては、hereを参照してください。
引用 :
「BIGINT(20)」仕様は数字の制限ではありません。これは、データが表示されるときに、20桁未満を使用する場合はゼロが左詰めされることを意味します。 2 ^ 64はBIGINTタイプのハードリミットであり、20桁そのものです。したがって、BIGINT(20)は、10 ^ 20未満のすべてがディスプレイ上にスペースで左詰めされることを意味します。
私の知る限り、範囲外の値を挿入しようとするときの違いは1つだけです。
例では
401421228216
を使用します。これは101110101110110100100011101100010111000
(長さ9文字)
INT(20)
がある場合、これはメモリに最小20ビットを割り当てることを意味します。ただし、2^20
より大きい値を挿入すると、INT(32) -> 2147483647
(またはUNSIGNED
の場合は2 * INT(32) -> 4294967295
)よりも小さい場合にのみ、正常に格納されます。例:
mysql> describe `test`;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(20) unsigned | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
1 row in set (0,00 sec)
mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0,00 sec)
mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected, 1 warning (0,06 sec)
mysql> SELECT * FROM `test`;
+------------+
| id |
+------------+
| 4294967295 |
+------------+
1 row in set (0,00 sec)
BIGINT(20)
がある場合、これはメモリに最小20ビットを割り当てることを意味します。ただし、2^20
よりも大きい値を挿入すると、BIGINT(64) -> 9223372036854775807
(またはUNSIGNED
の場合は2 * BIGINT(64) -> 18446744073709551615
)未満であれば、正常に格納されます。例:
mysql> describe `test`;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id | bigint(20) unsigned | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0,00 sec)
mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected (0,04 sec)
mysql> SELECT * FROM `test`;
+--------------+
| id |
+--------------+
| 401421228216 |
+--------------+
1 row in set (0,00 sec)
もう1つ追加したいのは、902054990011312のような非常に大きな数値を格納している場合、INT(20)
とBIGINT(20)
の違いを簡単に確認できることです。 BIGINT
に保存することをお勧めします。
Zerofillキーワードを使用したint(10)の例を示しましょう。
create table tb_test_int_type(
int_10 int(10),
int_10_with_zf int(10) zerofill,
unit int unsigned
);
いくつかのデータを挿入しましょう:
insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647)
;
それから
select * from tb_test_int_type;
# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'
私たちはそれを見ることができます
キーワードzerofill
を使用すると、10未満のnumは0を埋めますが、zerofill
を使用しないと、
次に、キーワードzerofill
を使用すると、int_10_with_zfは符号なしint型になります。マイナス記号を挿入すると、エラーOut of range value for column.....
が発生します。ただし、int_10にマイナスを挿入できます。また、4294967291をint_10に挿入すると、エラーOut of range value for column.....
が発生します
結論:
キーワードzerofill
のないint(X)は、範囲-2147483648〜2147483647のintと等しい
キーワードzerofill
を指定したint(X)、フィールドは符号なしintの範囲0〜4294967295に等しく、numの長さがXより小さい場合、左側に0が埋め込まれます。