|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
Привет. Столкнулся с непонятным поведением. Если колонка имеет тип TEXT(или varchar), то вставка строки вида "1.30" идет корректно. но если тип колонки заменить на STRING, то в базу попадает "1.3" p.s. вставка идет через биндинг Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
это баг? не подскажите способ, как обойти проблему без изменения таблицы? -- ~PPA() {} // ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 14:33 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
Это не баг, это фича. Не забывай что в SQLite не жесткая а предлагаемая типизация колонок, то есть в колонку любого типа ты можешь записать значение любого типа, но sqlite попытается привести твое значение в тип колонки. Если же задать колонку неизвестного типа (а string не является известным типом), то sqlite будет последовательно перебирать возможные типы хранения значения начиная с самых легких для хранения (с чисел то есть). В итоге, когда ты пишешь "1.30" в TEXT колонку оно и сохранится как честный текст. А когда ты пишешь "1.30" в колонку неизвестного базе типа, оно превращается в число и хранится в базе как число (незначащие нули в этот момент уже отсутствуют). А вот когда ты делаешь выборку оно конвертируется обратно в текст и ты получаешь 1.3. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 16:27 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
Как это решить? Ну проще всего будет все же изменить тип колонки на что-нибудь из списка TEXT, CHAR, VARCHAR или CLOB. Тип STRING для поля - это слишком неожиданная вещь. Кстати, из какой базы этот тип взялся? А еще можно использовать не С++ обертки над интерфейсом, а собственные команды sqlite и использовать sqlite3_bind_text() тогда значение будет жестко приведено в текстовый тип еще до попадания в базу и движок базы не будет смотреть на тяготение типов а сделает так как сказано клиентом. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 16:38 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
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 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 19:35 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
PPAвероятно это бага SQLIte :(я все же склонен думать, что это фича :) PPAа что лучше выбрать VARCHAR или TEXT ?Зависит от того собираешься ты в будущем копировать структуру своей БД на другую СУБД или нет. Для SQLite родным типом будет TEXT, а для большинства СУБД - VARCHAR. Но так как SQLite всегда приводит VARCHAR в TEXT, то и проблем нету. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 19:49 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
White Owl PPAвероятно это бага SQLIte :(я все же склонен думать, что это фича :) PPAа что лучше выбрать VARCHAR или TEXT ?Зависит от того собираешься ты в будущем копировать структуру своей БД на другую СУБД или нет. Для SQLite родным типом будет TEXT, а для большинства СУБД - VARCHAR. Но так как SQLite всегда приводит VARCHAR в TEXT, то и проблем нету. Копировать в другую СУБД не собираюсь я использую sqlite-amalgamation-3.5.6 для статической линковки. может знаешь где в исходниках, можно сделать тип колонки STRING синонимом TEXT или это не реально (формат хранения другой?). и лучше прирутить для обновления скрипт ALTER-ов для смены типа колонки ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 20:06 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
PPAКопировать в другую СУБД не собираюсь я использую sqlite-amalgamation-3.5.6 для статической линковки. может знаешь где в исходниках, можно сделать тип колонки STRING синонимом TEXT или это не реально (формат хранения другой?). и лучше прирутить для обновления скрипт ALTER-ов для смены типа колонкиэээээ мне кажется, что ты хочешь исправить существующую базу данных? Это не получится. Можно только создать новую базу с исправленными типами и перезалить в нее данные. А править в исходниках конечно можно, но опасно - через полгода-год ты решишь обновить в своей программе версию sqlite и тебе снова прийдется делать это исправление в исходниках, а если забудешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 20:47 |
|
SQLIte - типTEXT vs STRING
|
|||
---|---|---|---|
#18+
White Owl[quot PPA]А править в исходниках конечно можно, но опасно - через полгода-год ты решишь обновить в своей программе версию sqlite и тебе снова прийдется делать это исправление в исходниках, а если забудешь? конечно забуду :) но svn merge обычно делает слияния vendor-ных веток на автомате. решил не связываться с "кряком" движка, действительно, проще создать новый файлик. спасибо за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2008, 22:47 |
|
|
start [/forum/topic.php?fid=54&gotonew=1&tid=2009498]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
157ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 325ms |
total: | 591ms |
0 / 0 |