SQL-92 標準の拡張として、MySQL では、前出の表に挙げているように、TINYINT、MEDIUMINT、
および BIGINT 型もサポートしています。もう 1 つの拡張として、

    MySQL には、INT(4) のように、
    型の基本キーワードに続いて整数値の表示幅をかっこ内に指定できるオプションがあります。
    このオプションの表示幅の指定は、カラムに指定された幅より小さい幅を持つ値で表示の左側を
    埋める目的で使用されますが、そのカラムに格納できる値の範囲が制限されたり、そのカラムに
    指定された幅を超える幅を持つ値の桁数が制限されたりすることはありません。

オプションの拡張属性 ZEROFILL と組み合せて使用した場合、デフォルトのスペースに代わって
ゼロが埋め込まれます。 たとえば、INT(5) ZEROFILL として宣言されたカラムの場合、
値 4 は 00004 として取り出されます。注意: 整数カラムの表示幅より大きい値を格納すると、
MySQL で一部の複雑な結合のテンポラリテーブルを生成するときに問題が発生することがあります。
この場合、データはあくまでも本来のカラム幅に合っているものとして扱われます。

※ MS SQLやOracleでは値が制限されていたと思ってました。その為に例えば、intを
指定した場合、値の長さを()で指定してたのですが…… DBによって違うのかな?
もう一度マニュアル読み返して見ます。MYSQLのINTに関しては、一番最後にテストした
結果を記録しておきました。

    charやvarcharでも確認しましたが、文字列では( )で
    指定した値が他のDBと同じくMYSQLでも有効な文字列長の範囲になるようです。

NT カラムが UNSIGNED として設定されている場合、このカラムの範囲のサイズは変わりませんが、
最小値と最大値はそれぞれ 0 と 4294967295 になります。 したがって、-9999999999 および
9999999999 という値を格納しようとすると、このカラムにはそれぞれ 0 および 4294967296
という値が格納されます。


mysql> CREATE TABLE test_col (col1 INT(4) UNSIGNED, col2 INT(4) UNSIGNED ZEROFILL);
Query OK, 0 rows affected (0.05 sec)

mysql> desc test_col;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| col1 | int(4) unsigned | YES | | NULL | |
| col2 | int(4) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> INSERT INTO test_col (col1, col2) VALUES (1,1), (10000,10000);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from test_col;
+-------+-------+
| col1 | col2 |
+-------+-------+
| 1 | 0001 |
| 10000 | 10000 |
+-------+-------+
2 rows in set (0.00 sec)

mysql>

zerofill_test

参考サイト
6.2.1. 数値型

====================================================
追加検証 int ()の値とZEROFILLについて
====================================================


mysql> CREATE TABLE test_col_8
-> (
-> col1 INT(2) UNSIGNED,
-> col2 INT(2) UNSIGNED ZEROFILL,
-> col3 INT(3) UNSIGNED,
-> col4 INT(3) UNSIGNED ZEROFILL,
-> col5 INT(4) UNSIGNED,
-> col6 INT(4) UNSIGNED ZEROFILL,
-> col7 INT(5) UNSIGNED,
-> col8 INT(5) UNSIGNED ZEROFILL
-> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc test_col_8;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| col1 | int(2) unsigned | YES | | NULL | |
| col2 | int(2) unsigned zerofill | YES | | NULL | |
| col3 | int(3) unsigned | YES | | NULL | |
| col4 | int(3) unsigned zerofill | YES | | NULL | |
| col5 | int(4) unsigned | YES | | NULL | |
| col6 | int(4) unsigned zerofill | YES | | NULL | |
| col7 | int(5) unsigned | YES | | NULL | |
| col8 | int(5) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

test_col8

mysql> INSERT INTO test_col_8(col1,col2,col3,col4,col5,col6,col7,col8)
-> VALUES (1,1,1,1,1,1,1,1), (10000,10000,10000,10000,10000,10000,10000,10000);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from test_col_8;
+-------+-------+-------+-------+-------+-------+-------+-------+
| col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 |
+-------+-------+-------+-------+-------+-------+-------+-------+
| 1 | 01 | 1 | 001 | 1 | 0001 | 1 | 00001 |
| 10000 | 10000 | 10000 | 10000 | 10000 | 10000 | 10000 | 10000 |
+-------+-------+-------+-------+-------+-------+-------+-------+
2 rows in set (0.00 sec)

mysql>


test_col8_2


UNSIGNEDを指定してテーブルの列を作成すると整数のみの扱いになる。

SQLは標準SQLの全ての数値データタイプをサポートします。これらのタイプは、
概数値データタイプ(FLOAT、REAL、DOUBLE PRECISION)だけでなく、
真数値データタイプ(INTEGER、SMALLINT、DECIMAL、 NUMERIC)を含みます。
キーワード INT は INTEGER のシノニムで、キーワード DEC は DECIMAL のシノニムです。

BIT データタイプはビットフィールド値を格納します。
これは、MyISAM、MEMORY、 InnoDB テーブルに対してサポートされています。
SQL標準への拡張として、MySQLは TINYINT、MEDIUMINT、 BIGINT などの
整数タイプもサポートします。次のテーブルには、各整数タイプが必要とする
容量と値の範囲が示されています。

unsigned

全ての整数タイプは、任意の(標準ではない) 拡張子である UNSIGNED を持つ事ができます。
正数だけをコラムの中で許可し、大きい上位数値範囲が必要な時には符号無しの値を利用できます。
例えば、INT カラムが UNSIGNED の時、カラム範囲のサイズは同じですが、
その終点は -2147483648 と 2147483647 から、0 と 4294967295 までシフトします。

mysql> CREATE TABLE T_unsigned(
-> id INT UNSIGNED,
-> comment varchar(20)
-> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO T_unsigned(id,comment) VALUE(1,”zerofill test”),(-2,”zerofill test”),(-3,”zerofill – test”);
Query OK, 3 rows affected, 2 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 2

mysql> SHOW WARNINGS;
+———+——+———————————————+
| Level | Code | Message |
+———+——+———————————————+
| Warning | 1264 | Out of range value for column ‘id’ at row 2 |
| Warning | 1264 | Out of range value for column ‘id’ at row 3 |
+———+——+———————————————+
2 rows in set (0.00 sec)

mysql> select * from T_unsigned;
+——+—————–+
| id | comment |
+——+—————–+
| 1 | zerofill test |
| 0 | zerofill test |
| 0 | zerofill – test |
+——+—————–+
3 rows in set (0.00 sec)

mysql>

unsigned2

数値コラムに対して ZEROFILL を指定すると、MySQLは自動的にそのカラムに
UNSIGNED 属性を追加します。

mysql> CREATE TABLE T_zerofill(
-> id INT ZEROFILL,
-> comment varchar(20)
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO T_zerofill(id,comment) VALUE(1,”zerofill test”),(2,”zerofill test”),(-3,”zerofill – test”);
Query OK, 3 rows affected, 1 warning (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 1

mysql> SHOW WARNINGS;
+———+——+———————————————+
| Level | Code | Message |
+———+——+———————————————+
| Warning | 1264 | Out of range value for column ‘id’ at row 3 |
+———+——+———————————————+
1 row in set (0.00 sec)

mysql> select * from T_zerofill;
+————+—————–+
| id | comment |
+————+—————–+
| 0000000001 | zerofill test |
| 0000000002 | zerofill test |
| 0000000000 | zerofill – test |
+————+—————–+
3 rows in set (0.00 sec)

mysql>

zerofill


10.2. 数値タイプ


10.5. データタイプが必要とする記憶容量