回答:
http://dev.mysql.com/doc/refman/8.0/en/numeric-types.htmlを参照してください
INT 4バイトの符号付き整数です。
BIGINT 8バイトの符号付き整数です。
それぞれの値は、それぞれのバイト数に格納できる値より多くても少なくても受け入れません。つまり、2の値が32で、INT2の値が64ですBIGINT。
20インチはINT(20)、BIGINT(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)。これはに類似しています。これはそうではありません。
bar INT ZEROFILL(20)。それははるかに明確だったでしょう。しかし、その決定はずっと前に行われたものであり、今それを変更すると何百万ものデータベースのインストールが中断することになります。
型宣言の括弧内の数値は表示幅です。これは、データ型に格納できる値の範囲とは関係ありません。宣言できるからとInt(20)いって、最大10 ^ 20までの値を格納できるわけではありません。
[...]このオプションの表示幅をアプリケーションで使用すると、列に指定された幅よりも狭い幅の整数値をスペースで左詰めすることで表示できます。...
表示幅は、列に格納できる値の範囲や、列に指定された幅を超える幅を持つ値に対して表示される桁数を制限しません。たとえば、SMALLINT(3)として指定された列の通常のSMALLINT範囲は-32768〜32767であり、3文字で許可されている範囲外の値は3文字を超えて表示されます。
引用:
「BIGINT(20)」の仕様は、桁数の制限ではありません。これは、データが表示されるときに、20桁未満を使用する場合は、左側にゼロが埋め込まれることを意味します。2 ^ 64はBIGINTタイプのハード制限であり、それ自体が20桁です。したがって、BIGINT(20)は、10 ^ 20未満のすべての値がディスプレイ上のスペースで左側に埋め込まれることを意味します。
私が知る限り、小さな違いは、範囲外の値を挿入しようとするときだけです。
例
401421228216では、101110101110110100100011101100010111000(長さ39文字)であるを使用します
INT(20)システムで使用している場合、これはメモリに最低20ビットを割り当てることを意味します。しかし、あなたはより大きいという値を挿入するよ場合は2^20、それは少ないしだ場合にのみ、成功裏に保存されますINT(32) -> 2147483647(または2 * INT(32) -> 4294967295のためにUNSIGNED)例:
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(または2 * BIGINT(64) -> 18446744073709551615のためにUNSIGNED)例:
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)
int(10)の例として、zerofillキーワードを使用した例を1つ挙げましょう。テーブルは次のようになっています。
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'
私たちはそれを見ることができます
keywordを指定するとzerofill、numが10未満の場合は0が入力されますが、それがないzerofill場合は入力されません
次に、キーワードzerofillを使用すると、int_10_with_zfはunsigned int型になり、マイナスを挿入するとエラーになりますOut of range value for column.....。ただし、int_10にマイナスを挿入できます。また、4294967291をint_10に挿入すると、エラーが発生しますOut of range value for column.....
結論:
キーワードなしのint(X)zerofillは、int範囲-2147483648〜2147483647に等しい
int(X)with keyword zerofill、フィールドは符号なし整数の範囲0〜4294967295に等しい