MySQLの型:BigInt(20)とInt(20)


221

私は違いの間で何を思っていたBigIntMediumIntInt...それは、彼らがより多くを可能にするであろうことは明白思われ。しかし、私はInt(20)またはを作成することができBigInt(20)、それは必ずしもサイズについてではないように思われるでしょう。

いくつかの洞察は素晴らしく、ちょっと好奇心が強いでしょう。私はしばらくの間MySQLを使用していて、タイプを選択するときにビジネスニーズを適用しようとしましたが、この側面を理解できませんでした。

回答:


478

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)。これはに類似しています。これはそうではありません。


4
うわー、この投稿はこの問題に関する私の混乱を完全に解消しました。開発者による奇妙な選択のようです-私が推測したように、それは幅+最大値、またはビットなどです。
Sh4d0wsPlyr 2015年

27
`ZEROFILLオプションのみに影響します:`私の好奇心は終わりました
Umair

6
彼らがINTではなくZEROFILLでディスプレイを使って構文を設計したことを本当に望みます。例:bar INT ZEROFILL(20)。それははるかに明確だったでしょう。しかし、その決定はずっと前に行われたものであり、今それを変更すると何百万ものデータベースのインストールが中断することになります。
ビルカーウィン2016

1
これは非常に混乱することに同意します。ずっと数が限界だという印象でした。データが特定の範囲内にあることを知っているときに、いくつかの数値を小さくすることについてさえ心配しました。
jDub9

2
jDub9 @、はい、さらにNUMERIC / DECIMALは精度の引数に取ることに混乱しています、値の範囲と列のサイズに影響します。
ビルカーウィン

40

型宣言の括弧内の数値は表示幅です。これは、データ型に格納できる値の範囲とは関係ありません。宣言できるからとInt(20)いって、最大10 ^ 20までの値を格納できるわけではありません。

[...]このオプションの表示幅をアプリケーションで使用すると、列に指定された幅よりも狭い幅の整数値をスペースで左詰めすることで表示できます。...

表示幅は、列に格納できる値の範囲や、列に指定された幅を超える幅を持つ値に対して表示される桁数を制限しません。たとえば、SMALLINT(3)として指定された列の通常のSMALLINT範囲は-32768〜32767であり、3文字で許可されている範囲外の値は3文字を超えて表示されます。

各MySQLデータ型に格納できる最大値と最小値のリストについては、こちらを参照してください


18

引用

「BIGINT(20)」の仕様は、桁数の制限ではありません。これは、データが表示されるときに、20桁未満を使用する場合は、左側にゼロが埋め込まれることを意味します。2 ^ 64はBIGINTタイプのハード制限であり、それ自体が20桁です。したがって、BIGINT(20)は、10 ^ 20未満のすべての値がディスプレイ上のスペースで左側に埋め込まれることを意味します。


3
2 ^ 64(符号なし)は実際には21桁です。BIGINT(20)は危険です。それを使用する人々は、2 ^ 64が20桁の10進数に収まるという考えで、その使用法を正当化するようです。その場合、なぜ幅の制限を指定するのですか?結局のところ、それも正しくありません。2 ^ 64を正しく表示するには、21桁が必要です。
ヒースハニカット2016年

@HeathHunnicutt誤解しない限り、2 ^ 64 =18446744073709551616。20桁です。21とはどういう意味ですか?
drmercer

3

私が知る限り、小さな違いは、範囲外の値を挿入しようとするときだけです。

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)

1

もう1つポイントを追加したいと思います。902054990011312のような非常に大きな数値を格納している場合は、INT(20)との違いを簡単に確認できますBIGINT(20)。に保存することをお勧めしBIGINTます。


1

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.....

結論:

  1. キーワードなしのint(X)zerofillは、int範囲-2147483648〜2147483647に等しい

  2. int(X)with keyword zerofill、フィールドは符号なし整数の範囲0〜4294967295に等しい

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.