MariaDB Boolean Type?

ifi9·2023년 3월 21일
0

어떠한 객체의 사용 여부를 위한 속성을 추가해 주기 위해서 무슨 값 타입을 반환해 줄까 하는 고민이 얼마 전에 들었다. 지금까지는 별생각 없이 'Y', 'N' 과 같은 값을 저장하고 반환해 주었는데, Boolean 타입을 반환해 주면 어떨까라는 생각이 들어서 확인을 하게 되었다.

MariaDB Boolean Data Type

MariaDB 환경은 10.4.26 버전이다.

CREATE TABLE board (
	id BIGINT AUTO_INCREMENT PRIMARY KEY,
	title varchar(100),
	content varchar(100),
	enabled bool
);

예시를 들기 위한 테이블을 생성하는데 enabled라는 컬럼의 타입을 bool로 지정하여 만들었고,

desc board;

생성 후 테이블에 대한 정보를 확인하였더니
enabled 컬럼의 타입이 tinyint(1)로 바뀌어 있는 것을 볼 수 있었다.

tinyint(1)?

MariaDB TINYINT 문서에는 아래와 같이 설명되어 있다.

INT1 is a synonym for TINYINT. BOOL and BOOLEAN are synonyms for TINYINT(1).

INT1은 int(1)이며, 이것은 tinyint(4)를 뜻한다. 그리고 tinyint(1)은 BOOL, BOOLEAN 타입을 나타낸다는 것이다.
그냥 Boolean 타입을 생각하고 컬럼을 생성하면 tinyint(1)로 생성한다는 말이다.

tinyint(4)? tinyint(1)?

varchar 타입에는 길이를 지정하면 그 길이만큼 제한되는 것을 알고 있었다. 그럼 정수형에는 길이가 무슨 의미일까?

정수형에서 길이 지정은 최대 x 자리를 표시하는 것을 목표로 하지만, 저장할 수 있는 값의 범위를 제한하지 않는다고 한다.

ALTER TABLE board ADD enabled4 TINYINT(4) NULL;

대충 만들어서 확인해 보자.둘 다 tinyint의 범위인 -128 ~ 127까지 저장할 수 있었다. 아마 validation 같은 용도로 사용하기 위한 지정일 것이라고 생각이 된다.

아니 그럼 다른 값은?

일반적으로 TRUE는 1, FALSE는 0으로 알고 있을 것이다.

These types are synonyms for TINYINT(1). A value of zero is considered false. Non-zero values are considered true.
However, the values TRUE and FALSE are merely aliases for 1 and 0.

그래서 Boolean 문서에는 값이 0이라면 false로 간주한다고 표현되어 있다. 하지만 0과 1은 그저 Alias에 불과하다는 주의문도 있다.

0이 아니라면 true?

위에 대충 넣어둔 데이터를 활용해 보자.

SELECT * FROM board b WHERE enabled;
SELECT * FROM board b WHERE enabled IS TRUE;

이 경우 0이 아닌 모든 것이 where 절 조건에 해당되어 출력이 되었다.
그렇다면

SELECT * FROM board b WHERE enabled IS FALSE;

false 일 경우에는 당연히 값이 0 인 것 하나만 나왔다.

그런데 IS 연산의 경우에는 '='를 사용하여 값을 비교하는 것과는 다른 결과를 얻을 수 있다고 한다.

SELECT * FROM board b WHERE enabled = TRUE;

SELECT * FROM board b WHERE enabled = FALSE;


IS 연산이냐 = 비교냐에 따라 다른 결과가 나와버렸다. 만약에 Boolean 타입을 데이터 타입으로 고려 중이라면, SQL 작성 시에 조심해야 할 듯하다.

결론

위에서 확인할 수 있었던 것처럼 TRUE/FALSE가 아닌 0, 1이라는 값이 기본 설정인데, 타입의 범위가 원하는 것보다 훨씬 넓어서 이외에도 값을 저장할 수가 있다는 점이 꽤 큰 문제인 것 같다.
사용을 하게 된다면 유효성에 대한 검증을 더욱 조심해서 해야 할 것이고, 조건 검색 시 조건 또한 주의해서 사용해야 할 듯 하다.

별개로 이전에 ENUM type은 확장성이 좋지 않아서 비효율적이라 사용을 권하지 않는다고 들었다. 그런데 이 글을 작성하다 보니 사용 여부를 나타내는 정도라면 ENUM type도 여기서는 사용해도 괜찮지 않을까 하는 생각이 든다.

0개의 댓글