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

Comments are closed.

Post Navigation