토이 프로젝트의 ERD를 설계하는 중에 BOOLEAN 데이터 타입을 사용할 기회가 생겼다. 하지만 MySQL 에는 BOOLEAN 타입이 따로 존재하지 않았다.
MySQL 에서 BOOLEAN 타입이 없기 때문에 TINYINT(1) 을 사용하여 BOOLEAN을 대신한다.
BOOL, BOOLEAN
These types are synonyms for TINYINT(1). A value of zero is considered false. Nonzero values are considered true:
공식 설명에서도 나와있 듯이 0 인 경우 false, 1인 경우는 true 입니다.
하지만 0과 1이외에도 그 이상 숫자를 저장할 수 있습니다. TINTYINT 는 -128 ~ 128 사이의 숫자를 저장할 수 있기 때문입니다. 단, 0을 제외한 숫자의 경우(1포함)에는 true로 간주됩니다.
mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false |
+------------------------+
mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true |
+------------------------+
mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true |
+------------------------+
숫자 타입을 명시한 후 괄호안의 숫자는 무엇을 의미할까?
괄호안의 숫자는 숫자를 얼마나 디스플레이에 보여줄 것인지(디스플레이의 너비)를 의미합니다.
오해하지 말하야 할 것이 뒤에 있는 얼핏 저장가능할 수 있는 자리수라고 생각할 수 있겠지만 그렇지 않습니다. 단순히 디스플레이에 몇 자리수 까지 보여줄 지를 의미하는 것입니다.
가령 앞서 TINYINT(1) 은 디스플레이에 한자리만 보여주겠다는 것을 의미합니다.
공식문서에 따르면 TINYINT 타입의 경우 1바이트 크기를 차지하기 때문에 0 ~ 255 혹은 -128 ~ 127 까지 저장하는 것을 알 수 있습니다.
따라서 만약 TINYINT(1) 이라고 되어 있어도 결국 0000 0001 의 데이터가 저장되어 1바이트 크기를 차지하게 됩니다.
TINYINT, TINYINT(1), TINYINT(2) 모두 1바이트의 크기의 데이터를 저장합니다.
이는 INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT 모두 마찬가지 입니다. 디스플레이의 숫자 표시 크기 여부와 상관없이 같은 데이터 공간을 차지하게 됩니다.
실제 공식 문서에서도 해당 부분에 대해 강조하고 있는 것을 알 수 있습니다.
The display width does not constrain the range of values that can be stored in the column.
디스플레이 너비(괄호안의 숫자)는 열에 저장될 수 있는 값의 범위를 제한하지 않습니다.
또 중요한 사실이 하나 더 있습니다.
Nor does it prevent values wider than the column display width from being displayed correctly.
또한 열 표시 너비보다 넓은 값이 올바르게 표시되는 것을 방지하지도 않습니다."
무슨 말이냐하면, 예를 들어, SMALLINT(3)로 지정된 열의 일반적인 SMALLINT 범위는 -32768 ~ 32767입니다. 세 자리 허용 범위를 벗어나도 비록 SMALLINT(3) 이라고 되어 있지만, 세 자리 이상을 사용하여 전체가 표시된다는 것입니다. 즉, 써 있는 숫자(3)만큼 오도록 입력값을 강제하는 것도 아닙니다.
MySQL에서 BOOLEAN 타입이라고 해서 정해진 타입은 없다. 대신 TINYINT(1) 을 사용한다.
이때 TINYINT 타입의 경우 1바이트 크기를 저장할 수 있으며, 뒤에 괄호 안에 있는 숫자는 몇자리를 디스플레이에 표시할 지를 의미한다. 단, 디스플레이 숫자 크기를 넘었을 때 입력값을 제한하는 등의 기능은 없다.
가령 INTEGER(255) 는 4바이트를 저장할 수 있고, 255개의 숫자를 디스플레이에 표시한다는 것입니다.
https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html
https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
좋은 내용 잘 보고 갑니다!