문제

MySQL은 '부울'데이터 유형이없는 것 같습니다. MySQL에 True/False 정보를 저장하기 위해 어떤 데이터 유형을 '남용'합니까?

특히/PHP 스크립트에서 글을 쓰고 읽는 맥락에서.

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

  • 값 0/1을 포함하는 Tinyint, Varchar 필드,
  • 문자열 '0'/'1'또는 'true'/'false'를 포함하는 바르 르 차 필드
  • 그리고 마지막으로 두 가지 옵션 'true'/'false'를 포함하는 열거 된 필드.

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

그렇다면 어떤 데이터 유형을 사용하십니까? 간과 한 부울 값을 위해 설계된 유형이 있습니까? 한 유형이나 다른 유형을 사용하여 장점/단점이 있습니까?

도움이 되었습니까?

해결책

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

MySQL 5.0.3 현재 비트 데이터 유형은 비트 필드 값을 저장하는 데 사용됩니다. 비트 유형 (m)은 M- 비트 값을 저장할 수 있습니다. M의 범위는 1에서 64입니다.

그렇지 않으면, MySQL 매뉴얼에 따르면, 당신은 현재의 별명 인 bool과 boolean을 사용할 수 있습니다. 작은(1):

BOOL, BOOLEAN : 이러한 유형은 동의어입니다 작은(1). 0의 값은 False로 간주됩니다. 0이 아닌 값은 사실로 간주됩니다.

MySQL도 다음을 설명합니다.

우리는 향후 MySQL 릴리스에서 표준 SQL에 따라 전체 부울 유형 처리를 구현하려고합니다.

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

다른 팁

BOOL 그리고 BOOLEAN 동의어입니다 TINYINT(1). 제로입니다 false, 다른 것은 무엇이든 true. 추가 정보 여기.

이것은 제로 데이터 바이트를 사용하기 때문에 매우 감사하는 우아한 솔루션입니다.

some_flag CHAR(0) DEFAULT NULL

true로 설정하려면 설정하십시오 some_flag = '' 그리고 그것을 false로 설정하려면 설정하십시오 some_flag = NULL.

그런 다음 true를 테스트하려면 some_flag를 확인하십시오 IS NOT NULL, 거짓을 테스트하려면 some_flag를 확인하십시오. IS NULL.

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

이 질문은 답변되었지만 $ 0.02를 던질 것이라고 생각했습니다. 나는 종종 숯 (0)을 사용합니다. 여기서 ''== true 및 null == false.

에서 MySQL 문서

char (0)는 두 값만을 취할 수있는 열이 필요할 때 매우 좋습니다. char (0)로 정의 된 열은 하나의 비트 만 차지하며 값을 null과 ''(빈 문자) 만 가져갈 수 있습니다. .

부울 유형을 사용하는 경우 Tinyint (1)와 별표가 있습니다. 표준화 된 SQL을 사용하려는 경우 가장 좋습니다. 필드에 범위가 아닌 값이 포함될 수 있다는 것이 가장 좋습니다 (기본적으로 0이 아닌 것은 'True').

enum ( 'false', 'true')은 SQL의 문자열을 사용할 수있게하고 MySQL은 필드를 내부적으로 내부 정수로 저장합니다. .

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

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

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

이것을 사용하는 이점이 있는지는 모르겠지만 ... 내가 틀리지 않으면 MySQL은 부울 (bool)을 저장할 수 있으며 작은 작은 (1)로 저장할 수 있습니다.

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

비트는 부울 필드가 많으면 다양한 바이트 옵션 (Tinyint, Enum, Char (1))보다 유리합니다. 하나의 비트 필드는 여전히 전체 바이트를 차지합니다. 두 개의 비트 필드는 동일한 바이트에 맞습니다. 3, 4, 5, 6, 7, 8. 그 후 그들은 다음 바이트를 채우기 시작합니다. 궁극적으로 저축은 너무 작아서 집중해야 할 수천 개의 다른 최적화가 있습니다. 엄청난 양의 데이터를 다루지 않는 한, 그 소수의 바이트는 더 많은 것을 추가하지 않을 것입니다. PHP와 함께 비트를 사용하는 경우 값이 들어오고 나가야합니다.

MySQL이 약간의 데이터 유형을 구현할 때까지, 처리가 공간 및/또는 대량 트랜잭션과 같은 시간에 대해 진정으로 눌렀을 때. bit_flags 모든 부울 변수에 대해 SQL 쿼리에서 원하는 부울 비트를 마스크하고 이동하십시오.

예를 들어, 왼쪽 비트가 부울 필드를 나타내고 7 개의 가장 오른쪽 비트가 아무것도 나타내지 않으면 bit_flags 필드는 128 (이진 100000000)과 같습니다. 마스크 (숨기기) 7 개의 가장 오른쪽 비트 (비트 타이어 운영자 사용 &)), 8 번째 비트 7 개의 공백을 오른쪽으로 바꾸고 00000001로 끝납니다. 이제 전체 숫자 (이 경우 1)는 귀하의 값입니다.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

테스트 할 때 이와 같은 진술을 실행할 수 있습니다

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

등.

8 비트가 있으므로 1 바이트에서 8 개의 부울 변수가 있습니다. 미래의 프로그래머는 다음 7 비트를 항상 사용할 것입니다. ~ 해야 하다 마스크. 전환하지 마십시오. 그렇지 않으면 미래에 자신과 다른 사람들을 위해 지옥을 만들 것입니다. MySQL이 마스킹 및 이동을 수행하도록하십시오. 웹 스크립팅 언어 (PHP, ASP 등)를 사용하는 것보다 훨씬 빠릅니다. 또한 MySQL 댓글 필드에 의견을 작성하십시오. bit_flags 필드.

이 방법을 구현할 때 이러한 사이트가 유용하다는 것을 알게 될 것입니다.

나는 제로, 널스를 얻으려고 노력하고`` ''PHP, MySQL 및 우편 값의 루프를 정확하게 반올림하므로 '예'와 '아니오'만 사용합니다.

이것은 완벽하게 작동하며 명백하고 쉽게 할 수없는 특별한 대우가 필요하지 않습니다.

이 링크를 참조하십시오 MySQL의 부울 데이터 타입, 응용 프로그램 사용에 따르면, 0 또는 1 만 저장하기를 원한다면 비트 (1)이 더 나은 선택입니다.

여기서 답을 읽은 후 나는 사용하기로 결정했습니다 bit(1) 그리고 네, 공간/시간이 어떻게 든 더 좋습니다. 하지만 잠시 후 나는 내 마음을 바꾸었고 다시는 그것을 사용하지 않을 것입니다. 준비된 진술, 라이브러리 등 (PHP)을 사용할 때 내 개발이 많이 복잡해졌습니다.

그 이후로 나는 항상 사용합니다 tinyint(1), 충분히 좋아 보인다.

MySQL (8.0.16)과 Mariadb (10.2.1)는 모두 확인 제약 조건을 구현 했으므로 이제 사용하겠습니다.

bool_val TINYINT CHECK(bool_val IN(0,1))

당신은 보관할 수 있습니다 0, 1 또는 NULL, 변환 할 수있는 값뿐만 아니라 0 또는 1 같은 오류없이 '1', 0x00, b'1' 또는 TRUE/FALSE.

널을 허용하지 않으려면 NOT NULL 옵션

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

사용하면 거의 차이가 없습니다. TINYINT, TINYINT(1) 또는 TINYINT(123).

스키마가 상향 호환되기를 원한다면 사용할 수도 있습니다. BOOL 또는 BOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

DB <> 바이올린 데모

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top