web-dev-qa-db-ja.com

MySQLのタイプ:BigInt(20)vs Int(20)

BigIntMediumInt、およびIntの違いは何だろうと思っていました。ただし、Int(20)またはBigInt(20)を作成できますが、それは必ずしもサイズに関するものではないように思われます。

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

187
Parris

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)に類似した混乱の一般的な原因です。これはそうではありません。

400
Bill Karwin

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

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

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

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

38
John Feminella

引用

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

12
OMG Ponies

私の知る限り、範囲外の値を挿入しようとするときの違いは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)
2

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

1
Debasis Sabat

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.....が発生します

結論:

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

  2. キーワードzerofillを指定したint(X)、フィールドは符号なしintの範囲0〜4294967295に等しく、numの長さがXより小さい場合、左側に0が埋め込まれます。

0
Jayhello