数値データ型で引数の長さを使用する場合、私が知る限り、これは表示幅を指定します。
私は以下を試しました:
_mysql> create table boolean_test (var1 boolean, var2 tinyint);
Query OK, 0 rows affected (0.10 sec)
mysql> show create table boolean_test;
+--------------+-------------------------
| Table | Create Table
+--------------+-------------------------
| boolean_test | CREATE TABLE `boolean_test` (
`var1` tinyint(1) DEFAULT NULL,
`var2` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------------+---------------------------
1 row in set (0.00 sec)
_
まず、tinyintは1バイトの値です。では、tinyint(4)
の意味は何ですか? 4桁は使用できません。
_mysql> insert into boolean_test values(101,112);
Query OK, 1 row affected (0.03 sec)
mysql> select * from boolean_test;
+------+------+
| var1 | var2 |
+------+------+
| 10 | 112 |
| 101 | 112 |
+------+------+
2 rows in set (0.00 sec)
_
Tinyintでは10と101を格納し、tinyint(1)として定義されているにもかかわらず、これらの値を取得できることがわかります。
_var1
_の1が表示されませんか?つまり表示桁は1つだけですか?
データ的には、tinyint(1)
、tinyint(2)
、tinyint(3)
などはすべてまったく同じです。それらはすべて、SIGNED
の場合は-128〜127、UNSIGNED
の場合は0-255の範囲です。他の回答が指摘したように、括弧内の数字は単に表示幅のヒントです。
ただし、application = wiseの外観は異なる場合があることに注意してください。ここで、tinyint(1)
には特別な意味があります。たとえば、Connector/J(Javaコネクタ)はtinyint(1)
をブール値として扱い、アプリケーションに数値結果を返す代わりに、値をtrue
およびfalse
。これは、tinyInt1isBit=false
接続パラメーターを使用して変更できます。
Tinyint(1)は、データ型が8ビット(1バイト)であるため、-128から127の範囲の数値を保持できます。明らかに、符号なしtinyintは、0〜255の値を保持できます。
範囲外の値で警告なしに切り捨てられます。
mysql> create table a
-> (
-> ttt tinyint(1)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from a;
+------+
| ttt |
+------+
| 127 |
| -128 |
| 127 |
| -128 |
+------+
4 rows in set (0.00 sec)
mysql>
... sql_mode
を変更するか、サーバー構成を変更しない限り:
mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>
データ型のDDLで使用される値(例:tinyint(1))は、ご想像のとおり、表示幅です。ただし、これはオプションであり、クライアントが使用する必要はありません。たとえば、標準のMySQLクライアントはそれを使用しません。