[mysql] 부울 값을 저장하는 데 사용할 MySQL 데이터 유형

MySQL에는 ‘부울’데이터 유형이없는 것 같습니다. MySQL에 참 / 거짓 정보를 저장하기 위해 어떤 데이터 유형을 ‘남용’합니까?

특히 PHP 스크립트를 작성하고 PHP 스크립트에서 읽고 쓰는 맥락에서.

시간이 지남에 따라 몇 가지 접근법을 사용하고 보았습니다.

  • 0/1 값을 포함하는 tinyint, varchar 필드
  • 문자열 ‘0’/ ‘1’또는 ‘true’/ ‘false’를 포함하는 varchar 필드
  • 마지막으로 두 가지 옵션 ‘true’/ ‘false’를 포함하는 필드를 열거합니다.

위의 어느 것도 최적으로 보이지 않습니다. PHP의 자동 유형 변환은 부울 값을 단순히 제공하기 때문에 tinyint 0/1 변형을 선호합니다.

어떤 데이터 형식을 사용하십니까? 내가 간과 한 부울 값을 위해 설계된 유형이 있습니까? 한 유형 또는 다른 유형을 사용하여 장점 / 단점을 보십니까?



답변

MySQL 5.0.3 이상의 경우을 사용할 수 있습니다 BIT. 매뉴얼은 말합니다 :

MySQL 5.0.3부터 BIT 데이터 유형은 비트 필드 값을 저장하는 데 사용됩니다. BIT (M) 유형은 M 비트 값을 저장할 수있게합니다. M의 범위는 1-64입니다.

그렇지 않으면 MySQL 매뉴얼에 따르면 boint와 boolean을 사용할 수 있습니다. 이는 현재 tinyint (1)의 별칭입니다 .

Bool, Boolean :이 유형은 TINYINT (1)의 동의어입니다 . 0 값은 거짓으로 간주됩니다. 0이 아닌 값은 참으로 간주됩니다.

MySQL은 또한 다음과 같이 말합니다.

향후 MySQL 릴리스에서 표준 SQL에 따라 전체 부울 유형 처리를 구현할 계획입니다.

참조 : http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html


답변

BOOLBOOLEAN동의어입니다 TINYINT(1). 제로는 false, 다른 것입니다 true. 자세한 내용은 여기를 참조 하십시오 .


답변

이것은 제로 데이터 바이트를 사용하기 때문에 매우 감사합니다.

some_flag CHAR(0) DEFAULT NULL

true로 설정 some_flag = ''하고 설정하고 false로 설정하려면some_flag = NULL .

그런 다음 true IS NOT NULL를 테스트하려면 some_flag인지 확인하고 false를 테스트하려면 some_flag인지 확인하십시오.IS NULL .

이 방법은 Jon Warren Lentz, Baron Schwartz 및 Arjen Lentz의 “고성능 MySQL : 최적화, 백업, 복제 등”에 설명되어 있습니다.


답변

BOOLEAN 유형을 사용하는 경우 이는 TINYINT (1)의 별명입니다. 표준화 된 SQL을 사용하려는 경우이 필드가 범위를 벗어난 값을 포함 할 수 있음을 염두에 두지 않는 것이 가장 좋습니다 (기본적으로 0이 아닌 값은 ‘true’임).

ENUM ( ‘False’, ‘True’)을 사용하면 SQL에서 문자열을 사용할 수 있으며 MySQL은 필드를 열거 형이 지정된 순서에 따라 ‘False’= 0 및 ‘True’= 1 인 정수로 내부적으로 저장합니다. .

MySQL 5+에서는 BIT (1) 필드를 사용하여 1 비트 숫자 유형을 나타낼 수 있습니다. 나는 이것이 실제로 스토리지에서 더 적은 공간을 사용한다고 생각하지 않지만 가능한 값을 1 또는 0으로 제한 할 수 있습니다.

위의 모든 것은 거의 같은 양의 스토리지를 사용하므로 작업하기 가장 쉬운 스토리지를 선택하는 것이 가장 좋습니다.


답변

이 질문에 대한 답변을 받았지만 $ 0.02를 던질 것이라고 생각했습니다. 나는 종종을 사용한다 CHAR(0).'' == true and NULL == false .

에서 mysql을 문서 :

CHAR(0)두 개의 값만 사용할 수있는 열이 필요한 경우에도 매우 좋습니다. CHAR(0) NULL1 비트 만 차지하고 값 NULL''빈 문자열 만 사용할 수 있는 열입니다.


답변

부울 값을 Mysql에 저장하기 위해 TINYINT (1)을 사용합니다.

이것을 사용하는 이점이 있는지 모르겠습니다 …하지만 내가 잘못하지 않으면 mysql은 부울 (BOOL)을 저장할 수 있고 tinyint (1)로 저장할 수 있습니다

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html


답변

부울 필드가 많은 경우 비트는 다양한 바이트 옵션 (tinyint, enum, char (1))보다 유리합니다. 한 비트 필드는 여전히 전체 바이트를 차지합니다. 두 비트 필드는 같은 바이트에 맞습니다. 셋, 넷, 다섯, 여섯, 일곱, 여덟. 그 후 그들은 다음 바이트를 채우기 시작합니다. 궁극적으로 절감액은 매우 적으므로 집중해야 할 수천 가지 최적화가 있습니다. 엄청난 양의 데이터를 다루지 않는 한, 몇 바이트는 더 이상 추가되지 않습니다. PHP에서 비트를 사용하는 경우 들어오고 나가는 값을 타입 캐스트해야합니다.