BOOLEAN 또는 TINYINT 혼동


92

부울 날짜 유형을 사용하여 참 또는 거짓의 두 가지 상태 만 저장해야하는 사이트에 대한 데이터베이스를 설계하고있었습니다. MySQL을 사용하고 있습니다.
phpMyAdmin을 사용하여 데이터베이스를 설계하는 동안 BOOLEAN 데이터 유형과 TINYINT 데이터 유형이 모두 있음을 발견했습니다.
나는 다른 기사를 통해 TINYINT가 BOOLEAN과 동일하다고 말했습니다. 어떤 사람들은 BOOLEAN이 MySQL에서 TINYINT로 변환되었다고 말합니다.

내 질문은 둘 다 동일하다면 왜 두 개가 존재합니까? 그들 중 하나만 있어야합니다.

내가 읽은 기사에 대한 참조는 다음과 같습니다.
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

답변:


137

MySQL에는 내부 부울 데이터 유형이 없습니다. 가장 작은 정수 데이터 유형 인 TINYINT를 사용합니다.

BOOLEAN 및 BOOL은 동의어이기 때문에 TINYINT (1)과 동일합니다.

이 테이블을 만들어보십시오-

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

그런 다음 SHOW CREATE TABLE을 실행하면 다음 출력이 표시됩니다.

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)

1
그러나 귀하의 대답은 다른 모든 측면에서 정확합니다. OP를 혼란스럽게하는 것은 동의어의 존재입니다.
ypercubeᵀᴹ

2
이전 버전과의 호환성을 위해 수행 된 것 같습니다. BOOLEAN 데이터 유형은 MySQL 5 이전이고 BIT 유형이 최적화되지 않았으며 TINYINT이기도합니다. 문서에서-5.1에 계획된 새로운 기능 : 1 비트를 사용하도록 BIT 유형을 최적화하십시오. (BIT는 이제 1 바이트를 사용하며 TINYINT의 동의어로 처리됩니다.)
Devart

5
예, 당신은 알 수 있습니다 BIT(1)또는 BIT(17)심지어BIT(64)
ypercubeᵀᴹ

3
@Devart-귀하의 답변이 가장 많은 표를 얻고 처음에 (어쨌든 내 목록에) 나타나고 시간이 지나면 MySQL 5.1 및 BIT 유형에 대한 토론을 포함하도록 답변에 기꺼이 추가 할 가능성이 있습니까? 나중?
Jonathan

3
@Jonathan 아마도 가치가 있다고 언급 할 수도 있지만 BIT (1)은 실제로 TINYINT (1)보다 적은 공간을 사용하지 않으며 표준 mysql 콘솔을 사용할 때 대부분의 사람들이 기대하는 것처럼 표시되지 않습니다. 그 단점과 스토리지 이점 때문에 TINYINT (1) 또는 BOOLEAN을 사용하는 것이 내 경험에서 가장 일반적인 것 같습니다.
Tyler Smith

31

PHP 개발자를위한 참고 사항입니다 (주석으로 게시하는 데 필요한 stackoverflow 포인트가 없음) ... TINYINT 로의 automagic (및 자동) 변환은 PHP가 "BOOLEAN"열에서 "0"으로 값을 검색 함을 의미합니다. "1", (내가 예상 한) 참 / 거짓이 아닙니다.

테이블을 만드는 데 사용 된 SQL을보고있는 개발자는 "some_boolean BOOLEAN NOT NULL DEFAULT FALSE"와 같은 내용을보고 해당 열을 포함하는 행이 검색 될 때 참 / 거짓 결과를 볼 것이라고 합리적으로 예상 할 수 있습니다. 대신 (적어도 내 버전의 PHP에서는) 결과는 "0"또는 "1"이됩니다 (예, 문자열 "0"또는 문자열 "1", int 0/1이 아닙니다. 감사합니다 php).

그것은 nit이지만 단위 테스트가 실패하게 만들만큼 충분합니다.


2
추가로 PHP의 mysql 드라이버는 모든 정수 유형을 문자열로 가져옵니다.
kojow7 jul.

24

최신의 MySQL 버전은 새로운이 BIT예제는 당신이 현장에서 비트의 수를 지정할 수있는 데이터 형식 BIT(1)으로 사용하는 Boolean유형에만 수 있기 때문에, 0또는 1.


7

MySql 5.1 버전 참조 기준

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

================================================ =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric


1
참조에 따르면 필요한 스토리지는 실제로 "대략 (M + 7) / 8 바이트"입니다. 즉, 다음 전체 바이트로 반올림됩니다. 따라서 1 비트 가 필요하지 않습니다 .
mpen

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.