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 자리 숫자입니까?


한 번의 삽입 후에 왜 두 개의 행이 있습니까? 이 코드를 완전히 이해할 수는 없습니다.
WoodrowShigeru

답변:


24

데이터 현명한, tinyint(1), tinyint(2), tinyint(3)등 모든 정확히 동일합니다. 그것들은 모두 -128에서 127까지 SIGNED또는 0에서 255까지입니다 UNSIGNED. 다른 답변에서 언급했듯이 괄호 안의 숫자는 단순히 표시 너비 힌트입니다.

그러나 응용 프로그램 = 현명한 것은 다르게 보일 수 있습니다. 여기서 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.