Tinyint 대 Bit?


81

여기서 종교 전쟁을 시작하고 싶지는 않지만 데이터베이스에서 부울 값을 표현하는 방법에 대해 두 가지 생각이있는 것 같습니다. 어떤 사람들 bit은 적절한 데이터 유형 이라고 말하고 다른 사람들 tinyint은 더 낫다고 주장 합니다.

내가 아는 유일한 차이점은 다음과 같습니다.

  • bit: 저장 크기는 1 비트, 가능한 값은 0 또는 1입니다.
  • tinyint: 저장 크기는 1 바이트, 가능한 값은 0-255입니다.

부울 값을 표시해야 할 때 어떤 데이터 유형이 더 낫습니까? tinyint1보다 큰 값이 필요한 경우에 대비하여 추가 오버 헤드 가 가치가 있습니까?


1
"경우에 따라"는 매우 유동적 인 데이터베이스 디자인처럼 보입니다. 모든 것을 NVARCHAR (MAX)로 저장하고 모든 기지를 덮는 것은 어떨까요?
Stuart Ainsworth

TinyInt가 선호합니다. 그런 다음 필드에 대해 집계 된 카운트를 수행 할 때 캐스팅 할 필요가 없습니다. 또한 일부 프런트 엔드 언어는 Bit를 다른 언어와 다르게 해석하며 TinyInt를 사용하면 모든 프런트 엔드 언어에 대해 유효성 검사가 보편적으로 수행됩니다.
그레고리 하트

방금 phpMyAdmin에서 비트에 이상이 발생했습니다. 필드를 NULL로 설정하고 기본값이 설정되어 있지 않으면 기본값이 NULL 대신 <em> NULL </ em>으로 설정됩니다. +1 tinyint btw
Vörös Amadea

양식 csv 파일 1을 가져올 때 tinyint (1)의 경우 작동하지만 비트 (1)의 경우 b'1 '로 바꿔야합니다.
Rajat

답변:


90

테이블에 비트 열을 추가하면 단일 비트가 아닌 각 레코드에서 전체 바이트를 차지합니다. 두 번째 비트 열을 추가하면 동일한 바이트에 저장됩니다. 아홉 번째 비트 열에는 두 번째 바이트의 저장 공간이 필요합니다. 1 비트 열이있는 테이블은 스토리지 이점을 얻지 못합니다.

Tinyint와 bit는 둘 다 작동하도록 만들 수 있으며, 둘 다 성공적으로 사용했으며 강한 선호도가 없습니다.


이것은 매우 유용한 의견이며 귀하의 평판은 상당히 좋지만이를 뒷받침 할 참조가 있습니까? 구현 세부 사항입니까, 아니면 모든 엔진이 동일한 방식으로 처리합니까?
Jon z

3
@Jonz MySQL 은 여기 를 참조 하십시오 .
shmosel

19

비트 ... 당신이 "참 / 거짓 / 파일을 찾을 수 없음"클랜에 속하지 않는 한

참조를받지 못한 경우 ...

Linq2SQL의 경우 비트는 참 / 거짓으로 작동하므로 프로그래밍이 더 쉽습니다. 둘 다 장점이 있습니다.

또한 고려해야 할 프로그래밍 유지 관리도 있습니다. 귀하 (또는 중학교 인턴 프로그래머)가 2, 3, 25, 41, 167, 200 등을 사용하면 어떻게됩니까? 어디에 문서화되어 있습니까? 비트는 자체 문서화 되고 매우 보편적입니다.


11
비트는 널 입력 가능하므로 T / F / FNF를 계속 사용할 수 있습니다.
Austin Salonen

3
NULL과 FNF가 얼마나 악한가요? :) thedailywtf의 참으로 가치가 있습니다!
John Rudy

@Pratik 문제가 NULL이면 데이터베이스에 값이 없음을 의미합니다. 파일을 찾을 수 없음을 의미하지는 않습니다. 이렇게하면 문서화하기 어렵고 혼란스러운 행으로 상태를 암시 적으로 인코딩하기 시작합니다. 항목 테이블을 갖는 것과 같습니다. 품목이 판매되었는지 어떻게 알 수 있습니까? 판매 가격, 판매 날짜, 구매자 이름 등이 있는지 확인할 수 있습니다. 또는 확인 제약으로 모든 것을 시행하고 판매 된 품목에 대한 비트 필드를 만들 수 있습니다.
CodeMonkey

15

적절한 경우 비트를 사용합니다. 의미 론적으로 올바른 유형 (의미론 계산!) 외에도 단일 행 (어쨌든 SQL Server에서)에있는 여러 비트 필드 (최대 8 개)를 단일 바이트 저장소로 통합 할 수 있습니다. 8 번째 이후에는 다음 8 번째에 대해 추가 바이트가 필요합니다.

참조 :




2

정의상 부울은 두 개의 값만 허용합니다. 이것을 위해 왜 하나 이상의 것이 필요합니까? 3 개 (또는 그 이상) 상태 논리가 필요한 경우 더 큰 데이터 유형을 사용하지만 표준 부울 논리에 대해 비트 필드를 계속 사용합니다.


2

비트를 사용하면 검사 제약 조건을 사용할 필요가없고 ORM이 자동으로 비트를 nullable 부울 (C #)로 변환 할 수 있기 때문에 한 번 코딩하면 매우 감사합니다.


2

False를위한 공백 없음

무엇을 선택하든 NULL대신으로 설정할 수 있으며 추가 공간0 을 차지 하지 않습니다 (데이터베이스는 거의 항상 NULL모든 행의 모든 ​​필드에 대한 플래그를 가지고 있기 때문에 여기에 더 많은 정보를 제공합니다 ). 또한 기본값 / 가장 가능성이 높은 값이임을 확인하면 false더 많은 공간을 절약 할 수 있습니다!

진실을위한 약간의 공간

표시 할 값 true에는 필드 유형으로 정의 된 공간이 필요합니다. 를 사용 BIT하면 테이블에 이러한 열이 여러 개있는 경우에만 공간이 절약됩니다. TINYINT이는 8 개 필드 당 1 바이트 를 사용하기 때문입니다 (필드 당 1 바이트를 사용하는 경우 와 비교 ).

TINYINT추가 열 관리에 대해 걱정하지 않고 8 값 비트 마스크 를 사용자 정의 할 수 있다는 장점이 있으며 검색이 이론적으로 더 빠릅니다 (단일 정수 필드 대 여러 비트 필드). 그러나 느린 순서, 멋진 교차 인덱싱 항목 및 필드 이름 부족과 같은 몇 가지 단점이 있습니다. 나에게 가장 큰 손실은 무엇입니까? 데이터베이스는 어떤 비트가 어떤 비트 마스크에서 무엇을했는지 기록하기 위해 외부 문서를 필요로합니다.

어쨌든 TEXT필드를 사용 하여 부울 또는 그 집합을 저장 하려는 유혹을 피하십시오 . 텍스트를 검색하는 것은 서버에서 훨씬 더 많은 작업이며 "on, off, off"와 같은 임의의 이름 지정 체계는 상호 운용성을 손상시킬 수 있습니다.


1

방금 비트 그룹화 (SQL Server 2k5)를 시도했는데 잘 작동했습니다. 응용 프로그램에 올바른 데이터 유형을 사용하는 것을 좋아합니다. 그것이 참 / 거짓 필드라면 비트는 내가 사용하는 것입니다 ...


1

이 모든 이론적 토론은 훌륭하지만 실제로는 최소한 MySQL을 사용하고 실제로 SQLServer를 사용하는 경우에는 작업하기가 더 쉽다는 간단한 이유로 부울에 대해 이진이 아닌 데이터를 고수하는 것이 가장 좋습니다. 데이터를 출력하고 쿼리하는 등. MySQL과 SQLServer 간의 상호 운용성을 달성하려는 경우 (즉, 둘간에 데이터를 동기화하려는 경우) 특히 중요합니다. BIT 데이터 유형 처리가 둘에서 다르기 때문입니다. 따라서 실제로 숫자 데이터 유형을 고수하면 번거 로움이 훨씬 적습니다. MySQL이 TINYINT (1)로 저장되는 BOOL 또는 BOOLEAN을 고수하는 것이 좋습니다. MySQL Workbench와 MySQL Administrator가 BIT 데이터 유형을 표시하는 방식조차 좋지 않습니다 (바이너리 데이터에 대한 작은 기호).


1

위에서 언급 한 것 같지는 않지만 BIT 열 (예 : MIN, MAX, 특히 SUM)을 집계 할 수 없다는 문제가 있습니다. 방금 2008을 사용하여 테스트했지만 문제는 여전히 존재합니다. 이것이 제가 최근에 tinyint를 사용하는 가장 큰 이유입니다. 다른 하나는 tinyint가 확장되는 방식을 좋아한다는 것입니다. "두 값"비트 플래그가 갑자기 더 많은 가능한 값을 필요로 할 때 항상 고통 스럽습니다.


1
다른 데이터 유형으로 캐스팅하여 집계 할 수 있습니다. 그래도 왜 참 / 거짓을 합산해야합니까?
Martin Smith

2
우리는 자주 한 필드를 그룹화하고 결과별로 각 그룹에 대해 참인 다른 필드의 수를 합산합니다. sum의 대안은 전체 결과를 코드로 반환하고 거기에서 반복하여 때로는 1000 배 더 많은 데이터를 클라이언트에 반환하는 것입니다. . 그러나 캐스팅은이를 제거하므로 문제가되지 않습니다.
David Mårtensson 2011-06-30

0

우리는 int "vector"필드로 모든 테이블을 만듭니다. 그런 다음 해당 필드를 어떤 용도로도 할당 할 수있는 32 비트 모음으로 사용합니다. (잠재적으로 상태 집합에 비트 그룹 사용). 잊어 버린 경우 플래그 필드를 계속 추가 할 필요가 없습니다.


2
난독 화라고도합니다. 또는 평신도에게는 "유지 보수 악몽"이라고합니다.
Robert C. Barth

6
모든 테이블을 단일 TEXT 열로 만들고 모든 것을 쉼표로 구분하여 넣을 수 있습니다. 그러면 데이터 모델을 변경할 필요가 없습니다.
Tom H

1
우리는 다소 독특한 환경을 가지고 있습니다. 우리는 매우 큰 데이터 세트와 4 9의 가동 시간을 가지고 있으므로 테이블을 변경하는 것은 다소 금지 적입니다 (복제가 관련된 두 배). 중앙 위치에서 모든 비트를 추적하므로 유지 관리 문제를 방지하는 데 도움이됩니다.
Joe

0

@Kevin :group by 비트 필드에서 사용할 수 있다고 생각 합니다 (SQL Server 2005) :

declare @t table (
    descr varchar(10),
    myBit1 bit, 
    myBit2 bit
)
insert into @t values ('test1', 0, 1)
insert into @t values ('test2', 1, 0)
insert into @t values ('test3', 1, 1)
insert into @t values ('test4', 0, 0)

select myBit1, count(myBit1) from @t group by myBit1
select myBit2, count(myBit1) from @t group by myBit2

결과 :

myBit1 
------ -----------
0      2
1      2

myBit2 
------ -----------
0      2
1      2

0

TinyInt가 선호합니다. 그런 다음 필드에 대해 집계 된 카운트를 수행 할 때 캐스팅 할 필요가 없습니다. 또한 일부 프런트 엔드 언어는 Bit를 다른 언어와 다르게 해석하며 TinyInt를 사용하면 모든 프런트 엔드 언어에 대해 유효성 검사가 보편적으로 수행됩니다.



-2

나는 'T'또는 'F'와 함께 char (1)을 사용하는 것을 좋아합니다. 예, 다른 값과 함께 남용 될 수 있지만 적어도 비트 또는 이진 값을 사용하기가 더 어려운 보고서 또는 기타 장소에서보기 쉽습니다.


2
"T"및 "F"만 허용하도록 열에 제약 조건을 쉽게 추가 할 수 있습니다. 즉,보고 계층은 데이터베이스와 완전히 분리되어야합니다. 열이 표시되는 방식을 위해서만 데이터베이스 스키마를 변경해서는 안됩니다.
Tom H

나는 Darryl에 동의합니다. 일반 RDBMS 시스템에서 부울 유형에 대한 지원이 부족하다는 점을 감안할 때 (MySQL은 여기에서 혼자가 아닙니다) T / F (실제로는 Y / N을 선호 함)가 훨씬 더 읽기 쉽습니다. 원칙적으로 Tom H의 의견에 동의하지만 가독성이 그가 인정하는 것보다 훨씬 더 중요하다고 생각합니다. 데이터베이스 개발자는 다른 사람의 코드를 변경할 때 프런트 엔드를 보지 않습니다! 또한 개발자가 1과 0을 어떤 방식으로 간주하는지 항상 명확하지는 않습니다. 우리 모두가 '적절한'구식 방식으로 그것을하고 있었다면, 우리 -1는 사실 0을 표현하고 거짓을 표현하기 위해를 사용했을 것 입니다.
cartbeforehorse

이전 의견에 MySQL이 CHECK 제약 조건을 지원하지 않는 것처럼 보이며 T / F 옵션이 복잡해집니다. 열이 알파벳의 다른 문자로 채워지는 것을 막을 수 없기 때문입니다. 좋지 않아.
cartbeforehorse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.