Каков тип значения BOOL в SQLite? Я хочу сохранить в таблице значения TRUE/FALSE.
Я мог бы создать столбец INTEGER и сохранить в нем значения 0 или 1, но это не лучший способ реализовать тип BOOL.
Есть ли способ?
Спасибо.
Каков тип значения BOOL в SQLite? Я хочу сохранить в таблице значения TRUE/FALSE.
Я мог бы создать столбец INTEGER и сохранить в нем значения 0 или 1, но это не лучший способ реализовать тип BOOL.
Есть ли способ?
Спасибо.
В SQLite отсутствует собственный тип данных типа boolean. На Datatypes doc:
SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).
SQLite Boolean Тип данных:
SQLite не имеет отдельного булевского класса хранения. Вместо этого логические значения сохраняются как целые числа 0 (ложь) и 1 (истина).
Вы можете преобразовать boolean в int таким образом:
int flag = (boolValue)? 1 : 0;
Вы можете преобразовать int back в boolean следующим образом:
// 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, вот учебник.
Я дал один ответ здесь. Он работает для них.
В SQLite лучшее, что вы можете сделать, это использовать целые числа 0 и 1 для представления false и true. Вы можете объявить тип столбца следующим образом:
CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));
Опустите NOT NULL
, если вы хотите разрешить NULL
в дополнение к 0 и 1.
Использование имени типа 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
В других ситуациях использование default
с check
очень полезно:
sqlite> create table test ( id integer, b boolean default 0 check(b in (0,1)) );
sqlite> select * from test ;
sqlite> insert into test (id,b) values (7777, 1);
sqlite> insert into test (id) values (8888);
sqlite> select * from test ;
7777|1
8888|0
Обратите внимание, что несколько смутно, так как check
допускает только целое число 0 или целое число, значение действительно никогда не может быть null. Итак, в этом случае:
sqlite> insert into test (id) values (8888);
он вставляет значение по умолчанию, целое ноль.
Обратите внимание, что если вы также добавляете ограничение NOT NULL
,
b boolean not null default 0 check(b in (0,1))
что означает, что такие вставки:
sqlite> insert into test (id) values (8888);
просто запрещены, они не могут произойти и будут вызывать ошибку.
используя тип данных Integer со значениями 0 и 1, является самым быстрым.
В дополнение к ответу ericwa. Ограничения CHECK могут включать псевдо-логический столбец, применяя тип данных TEXT и позволяя только значения, специфичные для конкретного случая или 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
Но, если вы хотите сохранить кучу из них, вы можете поменять их и сохранить их как один int, немного похожий на разрешения/режимы файлов unix.
Например, для режима 755 каждая цифра относится к другому классу пользователей: владелец, группа, публикация. Внутри каждой цифры 4 читается, 2 записывается, 1 выполняется так, что 7 - это все, как бинарные 111. 5 читается и выполняется так 101. Составьте свою собственную схему кодирования.
Я просто пишу что-то для хранения данных расписания ТВ из Schedules Direct, и у меня есть двоичные или да/нет поля: стерео, hdtv, new, ei, close captioned, dolby, sap на испанском языке, премьера сезона. Таким образом, 7 бит или целое число с максимальным значением 127. Один символ действительно.
Пример из того, над чем я сейчас работаю. has() - это функция, которая возвращает 1, если вторая строка находится в первой. inp - входная строка для этой функции. misc - это unsigned char, инициализированный 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 булевых чисел в одном целом с комнатой для большего количества.
Вы можете упростить приведенные выше уравнения, используя следующее:
boolean flag = sqlInt != 0;
Если int-представление (sqlInt) логического значения равно 0 (false), логическое значение (флаг) будет false, иначе оно будет истинным.
Краткий код всегда приятнее работать с:)
Таблица UPDATE SET Boolcolumn = '1' WHERE......
Другой способ сделать это - столбец TEXT. А затем преобразуйте логическое значение между Boolean и String до/после сохранения/чтения значения из базы данных.
Ex. У вас "boolValue = true;
"
В строку:
//convert to the string "TRUE"
string StringValue = boolValue.ToString;
И вернемся к boolean:
//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);