PHP와 MySQL에서 불리언(Boolean) 값 처리하기
MySQL에서 불리언 값을 다루는 방법을 예제와 함께 자세히 알아보겠습니다. 이 글에서 사용한 MySQL 버전은 8.0.12입니다.
1. MySQL 버전 확인
먼저 현재 사용 중인 MySQL 버전을 확인해 보겠습니다.
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec)
2. MySQL에서 불리언 타입의 실체: TINYINT(1)
MySQL에서 불리언 값을 처리하려면 BOOL, BOOLEAN, 또는 TINYINT(1)를 사용할 수 있습니다. 흥미로운 점은 BOOL이나 BOOLEAN으로 컬럼을 선언하더라도 MySQL이 내부적으로 이를 TINYINT(1)로 변환한다는 것입니다.
BOOL 또는 BOOLEAN 데이터 타입에서 true 리터럴은 1로, false 리터럴은 0으로 표현됩니다. 이는 PHP나 C/C++ 언어의 불리언 처리 방식과 동일합니다.
3. BOOLEAN이 TINYINT(1)로 변환되는지 확인하기
MySQL이 BOOL 또는 BOOLEAN을 TINYINT(1)로 변환한다는 사실을 직접 확인해 보겠습니다. BOOLEAN 타입의 컬럼을 가진 테이블을 생성합니다.
mysql> create table BoolOrBooleanOrTinyintDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> isvalidAddress BOOLEAN,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.74 sec)이제 SHOW CREATE TABLE 명령으로 위 테이블의 DDL(테이블 정의문)을 확인해 보겠습니다.
mysql> show create table BoolOrBooleanOrTinyintDemo\G
실행 결과는 다음과 같습니다.
*************************** 1. row ***************************
Table: BoolOrBooleanOrTinyintDemo
Create Table: CREATE TABLE `boolorbooleanortinyintdemo` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`isvalidAddress` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)출력 결과를 보면 isvalidAddress 컬럼이 원래 BOOLEAN으로 선언했음에도 불구하고, 내부적으로 tinyint(1)로 변환된 것을 확인할 수 있습니다.
4. true와 false 값 저장 및 조회
이제 true 리터럴이 1로, false 리터럴이 0으로 표현되는지 확인해 보겠습니다. 테이블에 true와 false 값을 번갈아 삽입합니다.
mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(true); Query OK, 1 row affected (0.43 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(false); Query OK, 1 row affected (0.17 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(true); Query OK, 1 row affected (0.29 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(false); Query OK, 1 row affected (0.12 sec) mysql> insert into BoolOrBooleanOrTinyintDemo(isvalidAddress) values(true); Query OK, 1 row affected (0.33 sec)
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from BoolOrBooleanOrTinyintDemo;
조회 결과는 다음과 같습니다.
+----+----------------+ | Id | isvalidAddress | +----+----------------+ | 1 | 1 | | 2 | 0 | | 3 | 1 | | 4 | 0 | | 5 | 1 | +----+----------------+ 5 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이 true는 1로, false는 0으로 저장됩니다.
5. PHP에서의 불리언 처리
PHP도 마찬가지입니다. true는 1로, false는 0으로 표현됩니다.
다음 PHP 코드를 살펴보겠습니다. 변수 $isValidAddress에 값 1을 설정하면 if 조건식이 참(true)으로 평가되어 if 블록만 실행됩니다.
$isValidAddress = 1;
if($isValidAddress)
{
echo 'true is represented as ';
echo ($isValidAddress);
}
else
{
echo 'false is represented as ';
echo ($isValidAddress);
}실행 결과:
true is represented as 1
이번에는 같은 변수에 값 0을 설정해 보겠습니다. 이 경우 if 조건식이 거짓(false)으로 평가되어 else 블록만 실행됩니다.
$isValidAddress=0;
if($isValidAddress)
{
echo 'true is represented as ';
echo ($isValidAddress);
}
else
{
echo 'false is represented as ';
echo ($isValidAddress);
}실행 결과:
false is represented as 0
정리
- MySQL에서 BOOL, BOOLEAN, TINYINT(1)는 모두 동일하게 취급되며, 실제 저장 시 TINYINT(1)로 변환됩니다.
- true 리터럴은 1, false 리터럴은 0으로 저장됩니다.
- PHP 역시 true는 1, false는 0으로 평가되므로 MySQL과 PHP 간의 불리언 값 호환이 자연스럽게 이루어집니다.