|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
Доброе время суток. Столкнулся с такой проблемой. Потребовалось получить с сервера под Дебианом х64 доступ к Cache по ODBC. Поставил unixodbc, unixodbc-dev. Скачал крайний драйвер с официального сайта Интерсистемс (Cache.5.0.21.ODBC-6408-linuxamd64.tar.Z). Распаковал, запустил скрипт. Отредактировал файл cacheodbc.ini, сгенерированный в каталоге mgr: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47.
После этого тестовый скрипт из каталога dev/odbc/samples/select/ select.sh отлично работать. Я немного рихтую его до вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
И начинаются проблемы. Там есть несколько колонок, содержащих русские символы. Символы отображаются корректно. Но вот столбцы начинают склеиваться. Т.е. такое ощущение, что драйвер не видит конца поля записи и пишет следующее. Более того, зачастую слетает кодировка самой консоли (и русские, и английские буквы после выполнения скрипта отображаются некорректно). При попытке порабоать с соединением через библиотеку OTL наблюдается то же самое. Символы кодированы UTF8. Если есть русский, то поле заканчивается символами 0x03 0x01 (или другими служебными) и дальше в него попадает фрагмент следующего и т.д. Как следствие, библиотека постоянно падает с segmentation fault из-за некорректного определения конца строки, как мне кажется. Доводилось ли кому-либо работать с подобной связкой? Как заставить драйвер корректно отдавать данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2014, 09:42 |
|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
Пример вывода по одному стобцу с кириллицей: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2014, 09:47 |
|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
Не знаю, похожа ли наша проблема на вашу, возможно это вам поможет. Дело в том, что *nix-овые драйвера гораздо чувствительнее к спецификации данных. Если поле декларировано как String(MAXLEN=50), то столько символов драйвер и примет. А что дальше будет - непонятно. Может абракадарбра, может в другое поле залезет. Второй момент - из-за utf фактическая длина строки в два раза длиннее. Вы передаете строку 30 символов, фактически она превращается в 60, а что делать с тем, что идет после 50го символа - драйвер не понимает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2014, 09:54 |
|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
В общем, проблему решил костылем. Для OTL указывал предельное количество байт для char-полей, чтобы избежать segmentation fault при чтении: Код: plaintext
Со склеенными записями пришлось бороться поиском любых мусорных символов с кодами ниже 0x20 и заменой на 0x00. После этих манипуляций строки стали пригодны для работы с ними стандартными функциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2014, 07:51 |
|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
Хм, а правильно продекларировать поля не проще? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2014, 10:01 |
|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
Блок А.Н., что вы имеете ввиду под правильной декларацией? Проблема была в том, что возвращаемые драйвером строки не имели \0 на конце, т.е. не были валидными Си-строками. Более того, драйвер оказался крайне бажным. От ОТЛ пришлось отказаться, потому что select, возвращающий количество записей более одной вообще корректно не работал. Выглядело это так: 1) Запрашиваем набор данных, который должен вернуть 12 записей. 2) Вместо этого нам возвращается первые 6 из них, перемежающиеся пустыми записями: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Пришлось отказаться и использовать голый ODBC. В итоге уперся в то, что драйвер из базы преобразовывал cp866 в UTF8 без спросу, а при insert/update этого не делал, запихивая в cache utf-8. При этом однобайтовые кодировки нещадно резал, заменяя символами '?'. Проблемы решились использованием драйвера для версии 5.2 ссылко. Работает и с iODBC и с unixODBC. Пруф здесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2014, 02:15 |
|
Cache 5.0 Linux Odbc Driver
|
|||
---|---|---|---|
#18+
В своё время приходилось возиться с subj, даже была написана статья . В моём случае результирующий набор всегда возвращался в кодировке cp1251, и для его правильной обработки в Linux требовалась установка локализации CP1251. Для меня это дела давно минувших дней, (как говорится, всё что знал - написал), но может чем-то поможет в вашем случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2014, 11:20 |
|
|
start [/forum/topic.php?fid=39&msg=38583600&tid=1556897]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 282ms |
total: | 405ms |
0 / 0 |