tinyint(N)の意味は何ですか?


17

数値データ型で引数の長さを使用する場合、私が知る限り、これは表示幅を指定します。
私は次を試しました:

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)として定義されているにもかかわらず、これらの値を取得できることがわかりました。
私は1を見るべきではありませんvar1か?つまり、表示桁は1つだけですか?


1回の挿入後に2つの行があるのはなぜですか?このコードを完全に理解することはできません。
WoodrowShigeru

回答:


24

データ面では、tinyint(1)tinyint(2)tinyint(3)などすべてまったく同じです。それらはすべて-128〜127の範囲、SIGNEDまたは0〜255の範囲にあります。UNSIGNED。他の回答が指摘したように、括弧内の数字は単なる表示幅のヒントです。

ただし、application = wiseの外観が異なる場合があることに注意してください。ここでtinyint(1)、特別な意味を取ることができます。たとえば、Connector / J(Javaコネクタ)はtinyint(1)ブール値として処理し、数値結果をアプリケーションに返す代わりに、値をtrueおよびに変換しますfalse。これは、tinyInt1isBit=false接続パラメーターを介して変更できます。


13

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クライアントはそれを使用しません。

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