2009-05-09 4 views
202

Каков тип значения BOOL в SQLite? Я хочу сохранить в таблице значения TRUE/FALSE.Сохранить логическое значение в SQLite

Я мог бы создать столбец INTEGER и сохранить в нем значения 0 или 1, но это не лучший способ реализовать тип BOOL.

Есть ли способ?

Спасибо.

+0

возможно дубликат [Есть ли логическое буквальным в SQLite?] (Http://stackoverflow.com/questions/2510652/is- there-a-boolean-literal-in-sqlite) –

ответ

277

Для SQLite не существует встроенного булева типа данных. По Datatypes doc:

SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).

+13

"INTEGER. Значение представляет собой целое число со знаком, сохраненное в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения." Я думаю, использование 1 байт для хранения BOOL не так уж плохо. – joce

+1

Прямо из уст Лошади: «SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина)». – Tobias

+2

Что лучше с точки зрения производительности! true/false как строки или 0/1 целое число? –

77

SQLite Boolean Datatype:
SQLite не имеет отдельного булеву класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).

Вы можете преобразовать логическое значение в целое таким образом:

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, here is a tutorial.
Я дал один ответ here. Он работает на них.

+12

окончательная строка кода может быть просто «Boolean flag2 = (intValue == 1)» – cja

+10

Я предлагаю 'Boolean flag2 = (intValue!= 0); ' –

+0

или вы можете просто сделать Boolean flag2 = (intValue> 0); –

7

с использованием целочисленного типа данных со значениями 0 и 1 является самым быстрым.

-3

Другой способ сделать это колонка TEXT. А затем преобразуйте логическое значение между Boolean и String до/после сохранения/чтения значения из базы данных.

Ex. У вас есть "boolValue = true; "

Для строки:

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

и обратно в логическое значение:

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

@ Craig McMahon предлагает вместо этого использовать Integer: простые числа представляют true, non-primes представляют false – Berik

+13

Я нахожу это очень оскорбительным, @Berik. Очевидное решение состоит в том, чтобы сделать изображение «TRUE» или «FALSE» на изображении, а затем сохранить его в строке базы данных в виде BLOB с кодировкой JPEG. Затем можно было бы прочитать значение обратно, используя простой алгоритм извлечения объектов. –

55

В SQLite лучшее, что вы можете сделать, это использовать целые числа 0 и 1 для представления ложной и истинной. Вы можете объявить тип столбца следующим образом:

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

Опустить NOT NULL, если вы хотите, чтобы NULL в дополнение к 0 и 1.

Использование имени типа BOOLEAN здесь для удобства чтения в SQLite это просто тип with NUMERIC affinity.

Учтите, что CHECK constraints были поддержаны с SQLite 3.3.0 (2006).

Вот некоторые примеры Вставки, которые будут работать: (обратите внимание, как строки и числа с плавающей точкой обрабатываются как целые числа)

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 
1

Вы могли бы упростить выше, используя следующее:

boolean flag = sqlInt != 0; 

Если представление int (sqlInt) of логическое значение 0 (false), логическое (флаг) будет ложным, иначе оно будет истинным.

Сжатый код всегда лучше работать с :)

4

В дополнение к ответу 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 
3

Но, если вы хотите хранить кучу из них вы могли бы бит сместить их и хранить их все в одном межд, немного как Unix права доступа к файлам/режимы.

Например, для режима 755 каждая цифра относится к другому классу пользователей: владельцу, группе, общедоступной. Внутри каждой цифры 4 читается, 2 записывается, 1 выполняется так, что 7 - это все, как бинарные 111. 5 читается и выполняется так 101. Составьте свою собственную схему кодирования.

Я просто пишу что-то для хранения данных о расписании ТВ из расписаний Direct, и у меня есть двоичные или да/нет поля: стерео, hdtv, new, ei, close captioned, dolby, sap на испанском языке, премьера сезона. Таким образом, 7 бит или целое число с максимальным значением 127. Один символ действительно.

A Пример из того, над чем я сейчас работаю. has() - это функция, которая возвращает 1, если вторая строка находится в первой. inp - входная строка для этой функции. различ это символ без знака инициализируется 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 булевы в одном целом с комнатой для больше.

-1

UPDATE таблица SET Boolcolumn = '1' WHERE ......

+1

Добавьте некоторое объяснение с ответом на вопрос, как этот ответ помогает OP в устранении текущей проблемы –

Смежные вопросы