Разница между типом данных "Текст" и "Строка" в SQLite
У меня есть база данных SQLite с моим Android-приложением. Я заметил, что я случайно определил таблицу, используя тип данных "String" вместо типа данных "Текст". Вот код со строкой:
private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName string not null, UpdateDate string not null);";
Это работает. Он никогда не выдавал ошибку, и я могу хранить и извлекать данные. Однако я не могу найти ссылку на тип данных String в SQLite в документации или в Интернете. Как правило, все данные типа строки определяются с помощью "текста" следующим образом:
private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName text not null, UpdateDate text not null);";
Итак, мой вопрос в том, в чем разница между полем, определенным с типом данных типа "string" или "text"? Есть ли разница? Если да, каковы последствия, если таковые имеются, использования одного или другого?
Ответы
Ответ 1
Тонкая вещь, которую следует отметить здесь, заключается в том, что SQLite не применяет тип данных, которые вы помещаете в столбцы. Это означает, что вы можете поместить текст в числовое поле и т.д.
Чтобы понять разницу между двумя вашими операторами SQL, посмотрите раздел 2.1 Определение близости столбца, в котором перечислены типы столбцов, которые вы предоставляете классы хранения, используемые SQLite.
В этом случае тип string
сопоставляется с классом хранения NUMERIC
через правило 5. Объявление поля как text
в коде будет указывать СУБД на использование класса хранения text
. Опять же, поскольку SQLite не применяет типы столбцов, ваш код, вероятно, будет работать нормально при хранении строк как столбца NUMERIC
, как вы заметили.
В качестве альтернативного примера вы можете определить столбец с типом INTERESTING STUFF
и который будет отображаться в класс хранения INTEGER
по правилу 1.
В целом, вероятно, неплохо просто использовать text
для определения вашей таблицы.
Ответ 2
Это старый вопрос, но я хочу выделить конкретную разницу между типами столбцов STRING и TEXT. Если строка выглядит как числовое значение, STRING преобразует ее в числовое значение, а TEXT не будет выполнять никакого преобразования.
например.
create table t1(myint INTEGER, mystring STRING, mytext TEXT);
insert into t1 values ('0110', '0220', '0330');
insert into t1 values ('-0110', '-0220', '-0330');
insert into t1 values ('+0110', '+0220', '+0330');
insert into t1 values ('x0110', 'x0220', 'x0330');
insert into t1 values ('011.0', '022.0', '033.0');
select * from t1
выводит строки со значениями:
myint mystring mytext
110 220 0330
-110 -220 -0330
110 220 +0330
x0110 x0220 x0330
11 22 033.0
Это означает, что ведущие нули, нулевые конечные десятичные точки и символ плюс в числовых значениях будут удалены. Это вызовет проблемы, если вы собираетесь выполнять сопоставление строк, используя значения, считанные из таблицы.