SQLite에 부울 값 저장


답변:


365

SQLite에 대한 기본 부울 데이터 유형이 없습니다. 데이터 유형 문서 당 :

SQLite에는 별도의 부울 스토리지 클래스가 없습니다. 대신 부울 값은 정수 0 (거짓) 및 1 (참)로 저장됩니다.


24
"INTEGER. 값은 부호의 정수이며 값의 크기에 따라 1, 2, 3, 4, 6 또는 8 바이트로 저장됩니다." BOOL을 저장하기 위해 1 바이트를 사용하는 것이 그리 나쁘지 않다고 생각합니다.
joce

2
말의 입에서 바로 : "SQLite에는 별도의 부울 스토리지 클래스가 없습니다. 대신 부울 값은 정수 0 (거짓) 및 1 (참)로 저장됩니다."
Tobias

3
성능면에서 더 좋습니다! 문자열 또는 0/1 정수로 true / false?
Muhammad Babar

9
@MuhammadBabar 0/1 가장 확실합니다. 줄이 느리고 공간이 더 많이 걸립니다.
Davor

1
@joce 실제로 0과 1의 정수 (NULL은 물론)는 행 데이터 형식 선언에 직접 인코딩됩니다. 따라서 실제 데이터 저장 장치 만 계산하면 부울 당 0 바이트입니다. 파일 형식에 필요한 행당 열 수를 기록하는 경우 모든 데이터 유형에 추가 바이트가 필요하므로 훌륭하지 않습니다. :) (reference : sqlite.org/fileformat.html#record_format )
relative_random

93

SQLite에서는 정수 0과 1을 사용하여 false와 true를 나타내는 것이 가장 좋습니다. 다음과 같이 열 유형을 선언 할 수 있습니다.

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));

0과 1 외에 NOT NULL허용하려는 경우 생략하십시오 NULL.

BOOLEAN여기 에서 유형 이름의 사용은 가독성을 위해 사용되며 SQLite 는 NUMERIC 선호도가 있는 유형 일뿐 입니다.

참고 CHECK 제약 때문에 지원 된 SQLite는 3.3.0 (2006 년).

다음은 작동하는 INSERT 예입니다. (문자열과 부동 소수점 숫자가 정수로 구문 분석되는 방법에 유의하십시오)

sqlite> INSERT INTO foo VALUES(0);
sqlite> INSERT INTO foo VALUES(1);
sqlite> INSERT INTO foo VALUES(0.0);
sqlite> INSERT INTO foo VALUES(1.0);
sqlite> INSERT INTO foo VALUES("0.0");
sqlite> INSERT INTO foo VALUES("1.0");
sqlite> select mycolumn, typeof(mycolumn) from foo;
0|integer
1|integer
0|integer
1|integer
0|integer
1|integer

그리고 일부는 실패 할 것입니다 :

sqlite> INSERT INTO foo VALUES("-1");
Error: constraint failed
sqlite> INSERT INTO foo VALUES(0.24);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(100);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(NULL);
Error: foo.mycolumn may not be NULL
sqlite> INSERT INTO foo VALUES("true");
Error: constraint failed
sqlite> INSERT INTO foo VALUES("false");
Error: constraint failed

86

SQLite 부울 데이터 유형 :
SQLite에는 별도의 부울 저장소 클래스가 없습니다. 대신 부울 값은 정수 0 (거짓) 및 1 (참)로 저장됩니다.

이 방법으로 부울을 int로 변환 할 수 있습니다.

int flag = (boolValue)? 1 : 0;

다음과 같이 int를 다시 부울로 변환 할 수 있습니다.

 // Select COLUMN_NAME  values from db. 
 // This will be integer value, you can convert this int value back to Boolean as follows
Boolean flag2 = (intValue == 1)? true : false;

sqlite를 탐색하려면 자습서가 있습니다.
나는 여기에 하나의 대답을 주었다 . 그들을 위해 일하고 있습니다.


13
코드의 마지막 줄은 "Boolean flag2 = (intValue == 1)"일 수 있습니다.
cja

16
나는 제안한다Boolean flag2 = (intValue != 0);
Hamzeh Soboh

또는 Boolean flag2 = (intValue> 0);
Efrain Sanjay Adhikary


5

ericwa의 답변에 더. CHECK 제약 조건은 TEXT 데이터 유형을 적용하고 TRUE 또는 FALSE 경우에만 특정 값을 허용하여 의사 부울 열을 활성화 할 수 있습니다.

CREATE TABLE IF NOT EXISTS "boolean_test"
(
    "id" INTEGER PRIMARY KEY AUTOINCREMENT
,   "boolean" TEXT NOT NULL 
        CHECK( typeof("boolean") = "text" AND
               "boolean" IN ("TRUE","FALSE")
        )
);

INSERT INTO "boolean_test" ("boolean") VALUES ("TRUE");
INSERT INTO "boolean_test" ("boolean") VALUES ("FALSE");
INSERT INTO "boolean_test" ("boolean") VALUES ("TEST");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("true");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("false");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES (1);

Error: CHECK constraint failed: boolean_test

select * from boolean_test;

id  boolean
1   TRUE
2   FALSE

5

그러나 많은 파일을 저장하려면 유닉스 파일 사용 권한 / 모드와 같이 비트를 이동하여 하나의 int로 저장할 수 있습니다.

예를 들어 모드 755의 경우 각 숫자는 소유자, 그룹, 공개와 같은 다른 사용자 클래스를 나타냅니다. 각 숫자 내에서 4를 읽고, 2를 쓰고, 1을 실행하므로 7은 이진 111과 같이 7입니다. 5를 읽고 실행하여 101을 실행합니다. 고유 한 인코딩 체계를 구성하십시오.

나는 Schedules Direct에서 TV 일정 데이터를 저장하기 위해 무언가를 쓰고 있는데 스테레오, hdtv, 새로운, ei, 클로즈 캡션, dolby, 스페인어 수액, 시즌 프리미어 등 바이너리 또는 예 / 아니오 필드가 있습니다. 따라서 7 비트 또는 최대 127의 정수입니다. 실제로 한 문자입니다.

내가 지금하고있는 것의 AC 예. has ()는 두 번째 문자열이 첫 번째 문자열에 있으면 1을 반환하는 함수입니다. inp는이 함수의 입력 문자열입니다. misc는 0으로 초기화 된 부호없는 문자입니다.

if (has(inp,"sap='Spanish'") > 0)
  misc += 1;
if (has(inp,"stereo='true'") > 0)
  misc +=2;
if (has(inp,"ei='true'") > 0)
  misc +=4;
if (has(inp,"closeCaptioned='true'") > 0)
  misc += 8;
if (has(inp,"dolby=") > 0)
  misc += 16;
if (has(inp,"new='true'") > 0)
  misc += 32;
if (has(inp,"premier_finale='") > 0)
  misc += 64;
if (has(inp,"hdtv='true'") > 0)
  misc += 128;

그래서 더 많은 공간이있는 하나의 정수에 7 개의 부울을 저장하고 있습니다.


이 답변은 CS 관점에서 매우 따뜻합니다. :)
varun

2

다음을 사용하여 위의 방정식을 단순화 할 수 있습니다.

boolean flag = sqlInt != 0;

부울의 int 표현 (sqlInt)이 0 (false)이면 부울 (flag)은 false이고 그렇지 않으면 true입니다.

간결한 코드는 항상 작동하는 것이 좋습니다 :)


-4

또 다른 방법은 TEXT 열입니다. 그런 다음 데이터베이스에서 값을 저장 / 읽기 전후에 부울과 문자열 사이에서 부울 값을 변환하십시오.

전의. 당신은 "boolValue = true;"

문자열로 :

//convert to the string "TRUE"
string StringValue = boolValue.ToString;  

그리고 부울로 돌아 가기 :

//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);

6
@Craig McMahon은 Integer를 대신 사용하도록 제안합니다. 소수는 true를 나타내고, 비 프라임은 false를 나타냅니다
Berik

18
@Berik은 매우 불쾌감을 느낍니다. 확실한 해결책은 "TRUE"또는 "FALSE"라는 단어를 이미지에 렌더링 한 다음 데이터베이스 행에 JPEG 인코딩 BLOB으로 저장하는 것입니다. 그런 다음 간단한 기능 추출 알고리즘을 사용하여 값을 다시 읽을 수 있습니다.
Craig McMahon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.