![]() |
|
v7: 1SQLITE версий 1023, 1024, 1026 и НЕ совместимость sqlite таблиц (не работает) | ☑ | ||
---|---|---|---|---|
0
mrJill
03.11.16
✎
18:31
|
Доброго времени суток!
Имелась таблица заполненная при помощи 1sqlite 1.0.2.3 следующим образом: ЗапросSQLite.Подставлять("ТекВремя",ТекущееВремя()); ЗапросSQLite.Подставлять("ТекДата",ТекущаяДата()); ЗапросSQLite.Подставлять("ТекДок",Док); ТекстЗапроса=" |INSERT INTO Sklad (time, date, given, doc) VALUES (:ТекВремя,:ТекДата,0,:ТекДок); |"; Запрос к таблицам базы работал корректо. Текст запроса: ЗапросSQLite.Подставлять("НачДатаПров",ТекущаяДата()-45); ЗапросSQLite.Подставлять("КонДатаПров",ТекущаяДата()); ЗапросSQLite.Подставлять("ПроверДок",Док); ТекстЗапросаПров=" |SELECT | Sklad.doc as [Реализация $Документ.Реализация] |FROM | Sklad |WHERE | (Sklad.date between :НачДатаПров and :КонДатаПров) | and (Sklad.doc=:ПроверДок) |"; После обновления на версию 1.0.2.6 запрос перестал выполнять условие: "(Sklad.doc=:ПроверДок)" Вернуться на 1.0.2.3 пока не удалось: "file is encrypted or is not a database". Перешел на 1.0.2.4, но после использования 1.0.2.6 тормоза ЛЮТЫЕ. Что характерно: " |SELECT | Sklad.doc as [Реализация $Документ.Реализация] |FROM | Sklad |WHERE | (Sklad.date between :НачДатаПров and :КонДатаПров) //| and (Sklad.doc=:ПроверДок) | and (Sklad.doc LIKE '%'||:ПроверДок||'%') " - работает. Конвертация таблиц при помощи sqlite studio убивает непечатные символы, которые 1с инсертит в таблицы, соответственно обработки работать прекращают. Пока пытаюсь изобразить на 1.0.2.4 обработку пересоздания и перезаполнения (полагаю, что пересоздав базу в текущей sqlite тормоза уйдут), но хотелось бы и иных более вменяемых предложений. Более всего надеюсь на помощь от разаработчика 1.0.2.6. Буду благодарен за помощь. |
|||
1
Djelf
гуру
03.11.16
✎
18:58
|
(0) Без понятия про sqlite studio и откуда у тебя берутся не печатные символы. Как бы так сказать... такого быть не должно!
Можно попробовать консольной версией sqlite3.exe конвертнуть... Еще вариант ничего не конвертировать, но использовать COLLATE _1C при обращении к базе sqlite. Ну и можешь попробовать мои сборки 1.0.2.6 с некоторыми фиксами на более позднем движке sqlite https://cloud.mail.ru/public/9znr/ZJ6ULE9aR |
|||
2
Djelf
гуру
03.11.16
✎
19:03
|
+(1) Ну и или пересоздать индекс по Sklad.doc только с collate _1C, у тебя же есть индекс на это поле?
|
|||
3
mrJill
03.11.16
✎
19:31
|
(2) сборки работают также.
А можно пример синтаксиса "COLLATE _1C", в доках читал что он добавлен, но примера не увидел (видимо плохо смотрел). COLLATE _1C пользовать, конечно решение, но обработок с табличками SQLite работающих много и легко что-нибудь прохлопать... Сейчас попробою sqlite3.exe Непечатка - это, видимо, и есть те самые завершающие символы. Их studio и прихлопывает. |
|||
4
mrJill
03.11.16
✎
19:41
|
(1) sqlite3.exe делает то же, что и sqlite studio...
Черт меня дернул обновляться. :( |
|||
5
mrJill
03.11.16
✎
19:49
|
(1)
and (Sklad.doc=:ПроверДок collate _1C) - не помог. Игнорится. |
|||
6
Djelf
гуру
03.11.16
✎
21:17
|
(5) Спокойствие! Решим. Но у тебя что-то странное...
Ты засовываешь в базу документа в ID9, дальше сравниваешь опять таки с ID9. Collate _1С делает сравнение без учета лидирующий пробелов т.е. в принципе при сравнении на равенство тут любой вид сравнения годится. У меня много чего подобного таким образом работает и не сбоит! Можешь студией удалить лишнее и дать табличку на посмотреть? А то как-то не очень понятно что происходит... Разница между 1.0.2.3 и 1.0.2.6 в принципе только в движке sqlite... Переиндексацию делал? |
|||
7
Djelf
гуру
03.11.16
✎
21:21
|
(5) Надо бы проверить вот это
SELECT LENGTH(Sklad.doc) FROM Sklad GROUP BY 1
8 выводит или что то еще есть? |
|||
8
Djelf
гуру
03.11.16
✎
21:24
|
+() 9, конечно...
|
|||
9
mrJill
03.11.16
✎
21:49
|
1.0.2.4
SELECT LENGTH(Sklad.doc) FROM Sklad GROUP BY 1 LENGTH(Sklad_doc); 9 21 Нашел мусорную строку - грохнул. LENGTH(Sklad_doc); 9 Табличку - сейчас сделаю. |
|||
10
Djelf
гуру
03.11.16
✎
21:56
|
(9) Кажется понял на что уже пару лет ругается Ёпрст по поводу 1.0.2.6!!!
Видимо в "Подставлять" что-то сломалось, но я использую "УстановитьПараметр" в нем проблем нет. Как раз выходные... время поработать есть ;) |
|||
11
mrJill
03.11.16
✎
22:13
|
http://dropmefiles.com/dyQnW - вот табличка.
Тоже видел что ругается, но уже после того как обновился. Выходные - да. Время отвлечься от шумных буден и насладиться щелканьем своих клавиш в тихом офисе. Знаем. Практикуем. Планируем на завтра. УстановитьПараметр у меня, тоже, к сожалению, не работает. |
|||
12
mrJill
03.11.16
✎
22:14
|
Уточнение: на 1.0.2.4 - работает, на 6 - аналогично Подставлять.
|
|||
13
mrJill
03.11.16
✎
22:40
|
Проблема найдена (в теме Александра Орефкова изначально отписывался).
ОГРОМНОЕ СПАСИБО! Александр заметил, что типизация doc - INTEGER. В упор типизацию не видел. Сам балбес оказался. Завтра буду шерстить. На предмет INTEGER id'шников (видимо любые id по привычке как INTEGER заводились). Странно что 2.3, 2.4 умудрялись корректные данные возвращать. |
|||
14
Djelf
гуру
03.11.16
✎
22:58
|
(13) Посмотрел табличку, да, у тебя там integer, но sqlite обычно на это наплевать - хотите текст в колонку с integer и будет вам исключение из правила.
SELECT * FROM sklad WHERE doc=' 1E4R6 '
отрабатывает корректно несмотря на integer. |
|||
15
mrJill
03.11.16
✎
23:32
|
(14) с ' 1E600 ' тоже норм (у меня именно на нем сыпался)?
В 2.4 так дела и обстоят, 2.6 только с cast или конвертацией поля в char(9) взлетела... |
|||
16
mrJill
03.11.16
✎
23:37
|
Видимо в движке SQLite что-то поменялось.
Запрос из STUDIO при INTEGER тоже список возвращает ( ' 1E600 '). |
|||
17
Злопчинский
03.11.16
✎
23:47
|
Читаю
|
|||
18
Djelf
гуру
04.11.16
✎
00:06
|
(15) Если с каст`ом влетело, то да...
|
|||
19
Djelf
гуру
04.11.16
✎
00:08
|
Отсутствие типизации, не верная типизация и типизация при преобразовании это все чревато последствиями...
|
|||
20
mrJill
04.11.16
✎
10:01
|
(19) понятно. Это естественно. Сам балбес.
Но когда sqlite оно молчаливо хавал и возвращал корректные данные, а потом эту "фичу" выпилили и вернуться на предыдущую версию без проблем возможности нет - это... становится серьезной неожиданностью. У меня, н-р в различных системах автоотправки/автозагрузки/автопечати и системах обмена таких табличек не один десяток... Перешерстить теперь не мало нужно. + еще и данные не корректные возвращает не всегда и не везде это можно заметить сразу. |
|||
21
Djelf
гуру
04.11.16
✎
15:53
|
(20) Если ты про оригинальную 1.0.2.6 то она может так себя вести. Ну вот например http://www.sqlite.org/src/info/b7c8682cc1 Но с тех пор движок sqlite поменялся очень сильно.
Сверил код 1sqlite, как и предполагал, ломающих изменений не нашел. Чтобы база открылась на 1.0.2.3 нужно хекс-редактором в заголовке поправить байтики по адресу 0х12 и 0х13 с 0х02 на 0х01. У меня база после этого открылась. |
|||
22
mrJill
04.11.16
✎
16:19
|
(21) За байтики - большое спасибо. Буду знать.
Это бы теперь куда-нить в описание: вдруг кто откатиться надумает. Вопрос здесь не к 1sqlite, а именно к sqlite движку. Фигакс и часть полей char(9) с integer (того же length) уже корректно не сравнить. Хошь бы ошибки какие писали при запросах/инсертах. Останусь пока на 1.0.2.4 (тормоза были в некоторых таблицах из-за join'ов без индексов), 1.0.2.3 - такие моменты без тормозов отрабатывала (видимо где-то иная логика подбора индекса 1с таблиц была). Добавил в sqlite базы индексы - завертелось. Типизацию, естественно, поправил везде, где обнаружил (теперь на всю жизнь запомню что id и integer очень чревато ассоциировать и при работе с 1с нужно почаще смотреть в dd'шник), но на 1.0.2.6 переходить пока побаиваюсь (вдруг не везде обнаружил, а есть обработки, не корректная работа которых критична для фин. благополучия конторы). В общем приключение создал себе (да и другим) с не тривиальным сюжетом, немного пугающее, но, похоже, близящимся хэппи эндом. Еще раз спасибо! |
|||
23
Djelf
гуру
04.11.16
✎
19:28
|
Нашел! Вот в чем разница в движках 1.0.2.4 и 1.0.2.6
В sqlite была расширена поддержка форматов чисел http://www.sqlite.org/src/info/ca154f97a5907455 Т.е. " 1E4RS " как было так и осталось строкой, а " 1E702 " из-за явного указания типизации integer стало числом, но 10 в 702 степени sqlite не поддерживает и запрос перестает работать. |
|||
24
Злопчинский
04.11.16
✎
20:05
|
(23) вот оно что, Михалыч!
А если вместо Е будетD - не посчитает ли что это число двойной точности7 |
|||
25
Djelf
гуру
04.11.16
✎
20:41
|
(24) Нет ;) SQL error: unrecognized token: "1D7"
|
|||
26
Злопчинский
04.11.16
✎
23:29
|
(25) то есть как число не поняла?
|
|||
27
orefkov
04.11.16
✎
23:57
|
(14)
На типизацию поля sqlite наплевать при вставке - позволит вставить хоть что хоть куда. Но не наплевать при сравнении - будет влиять на выбор, как сравнивать поля. |
|||
28
Djelf
гуру
05.11.16
✎
00:09
|
(27) смотри (23), (14) этого не учитывало, поскольку еще не знало ;)
|
|||
29
mrJill
06.11.16
✎
15:59
|
(23) потрясно! :)
И ладно бы оно просто сравнить не могло, да ругнулось, оно ж радостно сообщает: вот куча значений с вашим where. |
|||
30
orefkov
06.11.16
✎
18:26
|
(29)
Об это многие спотыкаются. Поначалу, узнав что sqlite позволяет вставить значение любого типа в любую колонку, вдохновенно начинают забивать на типизацию, пока не напорются на подобные грабли. Я сам чрез это прошел в своё время :) |
|||
31
Djelf
гуру
06.11.16
✎
20:33
|
(29)(30) Я согласен с обоими мнениями, но с оговоркой.
Было бы совсем не плохо, если бы при явном указании типизации sqlite бы ругалось, а при отсутствии явной типизации кушало что дают (для варианта работы ключ-значение). Если посмотреть по моей ссылке в (23) на тикет, то это преобразование было сломано в sqlite >3.1.3 и починено в >3.7.2 т.е. за 5 лет никто не обнаружил! Ну вот прошло еще почти 5 лет со времени 3.7.3 и эта ошибка опять вылезла, только наоборот ;) Сейчас этот случай есть в тестах и больше не пройдет, но при авто-контроле явной типизации не продержался бы и неделю. С другой стороны понятно почему этого нет. Этот движок sql разрабатывается как встраиваемый с экстримально компактным размером, поэтому перегружать ее встроенными возможностями Hipp видимо он не хочет. P.S. но мог бы сделать опцией при компиляции и прагмой... эх... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |