etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2023. 4. 23. 02:47
반응형

질문자 :Beat


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

특히 PHP 스크립트에서 쓰기 및 읽기의 맥락에서.

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

  • tinyint, 값 0/1을 포함하는 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 매뉴얼에 따라 현재 tinyint (1) 의 BOOL 또는 BOOLEAN

Bool, Boolean: 이러한 유형은 TINYINT (1)의 동의어입니다. 값이 0이면 false로 간주됩니다. 0이 아닌 값은 true로 간주됩니다.

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

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

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


markus

BOOLBOOLEAN TINYINT(1) 동의어입니다. 0은 false 이고 다른 것은 모두 true 입니다. 자세한 내용은 여기를 참조하십시오.


Philip Morton

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

 some_flag CHAR(0) DEFAULT NULL

true로 설정하려면 some_flag = '' 를 설정하고 false로 설정 some_flag = NULL 설정합니다.

some_flag이 경우 사실에 대한 테스트로 확인 IS NOT NULL , 거짓에 대한 테스트에 some_flag이 경우, 검사를 IS NULL .

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


R. S.

이 질문에 대한 답변을 받았지만 0.02달러를 투자하겠다고 생각했습니다. 나는 종종 CHAR(0) 사용합니다. 여기서 '' == true and NULL == false 입니다.

MySQL 문서에서 :

CHAR(0) 은 또한 두 개의 값만 사용할 수 있는 열이 필요할 때 매우 유용합니다. CHAR(0) NULL NULL'' (빈 문자열) 값만 사용할 수 있습니다. .


Josh

BOOLEAN 유형을 사용하는 경우 TINYINT(1)로 별명이 지정됩니다. 이것은 표준화된 SQL을 사용하고 필드에 범위를 벗어난 값이 포함될 수 있다는 점에 신경 쓰지 않는 경우에 가장 좋습니다(기본적으로 0이 아닌 모든 것이 'true'임).

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

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

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


Ciaran McNulty

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

이것을 사용하는 것이 어떤 이점이 있는지는 모르겠지만 ... 그러나 내가 틀리지 않으면 mysql은 부울(BOOL)을 저장할 수 있고 이를 tinyint(1)로 저장할 수 있습니다.

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


Fred

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


Thor

MySQL이 비트 데이터 유형을 구현할 때까지 대용량 트랜잭션과 같이 공간 및/또는 시간에 대한 처리가 정말 눌린 bit_flags 모든 부울 변수에 대해 bit_flags라는 TINYINT 필드를 생성하고 원하는 부울 비트를 마스크하고 이동합니다. SQL 쿼리.

bit_flags 왼쪽 비트가 bool 필드를 나타내고 맨 오른쪽 7비트가 아무 것도 나타내지 않는 경우 bit_flags 필드는 128(2진 10000000)과 같습니다. & 사용하여 맨 오른쪽 비트 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비트가 있으므로 한 바이트에서 잠재적으로 8개의 부울 변수가 있습니다. 어떤 미래의 프로그래머는 항상 다음 7비트를 사용할 것이므로 마스크 해야 합니다. 그냥 이동하지 마십시오. 그렇지 않으면 미래에 자신과 다른 사람들을 위해 지옥을 만들 것입니다. MySQL이 마스킹 및 이동을 수행하도록 하십시오. 이는 웹 스크립팅 언어(PHP, ASP 등)에서 수행하는 것보다 훨씬 빠릅니다. bit_flags 필드에 대한 MySQL 주석 필드에 주석을 입력해야 합니다.

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


Jonathan

PHP, MySql 및 POST 값의 루프에서 0, NULLS 및 ''를 정확하게 구하는 데 지쳤으므로 '예' 및 '아니오'만 사용합니다.

이것은 완벽하게 작동하며 명확하지 않고 하기 쉽지 않은 특별한 치료가 필요하지 않습니다.


Geoff Kendall

Mysql의 이 링크 Boolean 데이터 유형을 참조하면 응용 프로그램 사용에 따라 0 또는 1만 저장하려는 경우 bit(1)이 더 나은 선택입니다.


Vidz

MySQL(8.0.16)과 MariaDB(10.2.1)는 모두 CHECK 제약 조건을 구현했으므로 이제 다음을 사용합니다.

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

0 , 1 또는 NULL '1' , 0x00 , b'1' 또는 TRUE / FALSE 와 같은 오류 없이 0 또는 1 로 변환할 수 있는 값만 저장할 수 있습니다.

NULL을 허용하지 않으려면 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<>피들 데모


Paul Spiegel

bit(1) 을 사용하기로 결정했습니다. 예, 공간/시간 면에서 어떻게 든 더 낫습니다. 하지만 잠시 후 마음이 바뀌었고 다시는 사용하지 않을 것입니다. 준비된 명령문, 라이브러리 등(php)을 사용할 때 개발이 많이 복잡해졌습니다.

그 이후로 나는 항상 tinyint(1) 사용하는데 충분해 보입니다.


Lemures

부울 값을 저장하기 위해 BOOL, BOOLEAN 데이터 유형을 사용할 수 있습니다.

이러한 유형은 TINYINT(1)의 동의어입니다.

그러나 BIT(1) 데이터 유형은 부울 값(true[1] 또는 false[0])을 저장하는 것이 더 합리적이지만 TINYINT(1)는 데이터를 출력하거나 쿼리할 때 작업하기가 더 쉽습니다. MySQL과 다른 데이터베이스 간의 상호 운용성을 달성하기 위해. 이 답변이나 스레드를 확인할 수도 있습니다.

MySQL은 또한 BOOL, BOOLEAN 데이터 유형을 TINYINT(1)로 변환합니다.

또한 문서 읽기


Premkumar chalmeti

출처 : http:www.stackoverflow.com/questions/289727/which-mysql-data-type-to-use-for-storing-boolean-values

반응형