powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLIte - типTEXT vs STRING
8 сообщений из 8, страница 1 из 1
SQLIte - типTEXT vs STRING
    #35188153
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Столкнулся с непонятным поведением.
Если колонка имеет тип TEXT(или varchar), то вставка строки вида "1.30" идет корректно.
но если тип колонки заменить на STRING, то в базу попадает "1.3"

p.s.
вставка идет через биндинг

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    sqlite3_transaction l_trans(m_flySQLiteDB);
    sqlite3_command* l_sql = prepareSQL(
		"insert into fly_file (tth_id,dic_path,name,size,stamp) values(?,?,?,?,?);");
    l_sql->bind( 1 , l_tth_id);
    l_sql->bind( 2 , l_path_id);
    [color=red]l_sql->bind( 3 , p_FileName);[/color]
    l_sql->bind( 4 , p_tth.getFileSize());
    l_sql->bind( 5 , p_TimeStamp);
	l_sql->executenonquery();
    l_trans.commit();


это баг?
не подскажите способ, как обойти проблему без изменения таблицы?


--
~PPA() {} //
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35188710
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не баг, это фича.
Не забывай что в SQLite не жесткая а предлагаемая типизация колонок, то есть в колонку любого типа ты можешь записать значение любого типа, но sqlite попытается привести твое значение в тип колонки. Если же задать колонку неизвестного типа (а string не является известным типом), то sqlite будет последовательно перебирать возможные типы хранения значения начиная с самых легких для хранения (с чисел то есть).
В итоге, когда ты пишешь "1.30" в TEXT колонку оно и сохранится как честный текст. А когда ты пишешь "1.30" в колонку неизвестного базе типа, оно превращается в число и хранится в базе как число (незначащие нули в этот момент уже отсутствуют). А вот когда ты делаешь выборку оно конвертируется обратно в текст и ты получаешь 1.3.
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35188765
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как это решить? Ну проще всего будет все же изменить тип колонки на что-нибудь из списка TEXT, CHAR, VARCHAR или CLOB. Тип STRING для поля - это слишком неожиданная вещь. Кстати, из какой базы этот тип взялся?

А еще можно использовать не С++ обертки над интерфейсом, а собственные команды sqlite и использовать sqlite3_bind_text() тогда значение будет жестко приведено в текстовый тип еще до попадания в базу и движок базы не будет смотреть на тяготение типов а сделает так как сказано клиентом.
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35189366
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКак это решить? Ну проще всего будет все же изменить тип колонки на что-нибудь из списка TEXT, CHAR, VARCHAR или CLOB. Тип STRING для поля - это слишком неожиданная вещь. Кстати, из какой базы этот тип взялся?
А еще можно использовать не С++ обертки над интерфейсом, а собственные команды sqlite и использовать sqlite3_bind_text() тогда значение будет жестко приведено в текстовый тип еще до попадания в базу и движок базы не будет смотреть на тяготение типов а сделает так как сказано клиентом.

тип STRING взялся случайно ( где-то нашел в инете :)
Но враппер зовет именно этот метод....
void sqlite3_command::bind(int index, const std::string &data) {
if(sqlite3_bind_text(this->stmt, index, data.data(), (int)data.length(), SQLITE_TRANSIENT)!=SQLITE_OK)
throw database_error(this->con);
}

вероятно это бага SQLIte :(
а что лучше выбрать VARCHAR или TEXT ?
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35189390
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAвероятно это бага SQLIte :(я все же склонен думать, что это фича :)
PPAа что лучше выбрать VARCHAR или TEXT ?Зависит от того собираешься ты в будущем копировать структуру своей БД на другую СУБД или нет. Для SQLite родным типом будет TEXT, а для большинства СУБД - VARCHAR. Но так как SQLite всегда приводит VARCHAR в TEXT, то и проблем нету.
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35189406
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl PPAвероятно это бага SQLIte :(я все же склонен думать, что это фича :)
PPAа что лучше выбрать VARCHAR или TEXT ?Зависит от того собираешься ты в будущем копировать структуру своей БД на другую СУБД или нет. Для SQLite родным типом будет TEXT, а для большинства СУБД - VARCHAR. Но так как SQLite всегда приводит VARCHAR в TEXT, то и проблем нету.

Копировать в другую СУБД не собираюсь
я использую sqlite-amalgamation-3.5.6 для статической линковки.
может знаешь где в исходниках, можно сделать тип колонки STRING синонимом TEXT
или это не реально (формат хранения другой?).
и лучше прирутить для обновления скрипт ALTER-ов для смены типа колонки
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35189452
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAКопировать в другую СУБД не собираюсь
я использую sqlite-amalgamation-3.5.6 для статической линковки.
может знаешь где в исходниках, можно сделать тип колонки STRING синонимом TEXT
или это не реально (формат хранения другой?).
и лучше прирутить для обновления скрипт ALTER-ов для смены типа колонкиэээээ мне кажется, что ты хочешь исправить существующую базу данных? Это не получится. Можно только создать новую базу с исправленными типами и перезалить в нее данные.
А править в исходниках конечно можно, но опасно - через полгода-год ты решишь обновить в своей программе версию sqlite и тебе снова прийдется делать это исправление в исходниках, а если забудешь?
...
Рейтинг: 0 / 0
SQLIte - типTEXT vs STRING
    #35189550
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl[quot PPA]А править в исходниках конечно можно, но опасно - через полгода-год ты решишь обновить в своей программе версию sqlite и тебе снова прийдется делать это исправление в исходниках, а если забудешь?

конечно забуду :)
но svn merge обычно делает слияния vendor-ных веток на автомате.
решил не связываться с "кряком" движка, действительно, проще создать новый файлик.
спасибо за помощь!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLIte - типTEXT vs STRING
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]