|
Запрос к Firebird возвращает нечитаемые символы вместо русских | ☑ | ||
---|---|---|---|---|
0
Pete
19.01.16
✎
13:59
|
Доброго всем дня.
При обращении к базе Firebird получаю ответ в формате UTF8 и русские буквы отражаются в форме нечитабельно. Conn = Новый COMObject("ADODB.Connection"); Conn.ConnectionString = "Driver=Firebird/InterBase(r) driver;" + "Dbname="+АдресБазы+";" "UID=SYSDBA;PWD=masterkey;" + "CHARSET=WIN1251"; RecordSet = Новый COMObject("ADODB.Recordset"); RecordSet.ActiveConnection = Conn; RecordSet.CursorType = 1; RecordSet.LockType = 3; RecordSet.Open(«SELECT * FROM STAFF», Conn); Попытка использовать при подключении CHARSET=UTF8 результата не даёт. Аналогично, пытаясь в запросе наложить условие с русскими символами, получаю «ничего». Если в условие вставлять возвращаемый запросом нечитабельный текст, то отбор срабатывает корректно. Вопрос: как получить содержимое полей в нормальной кодировке? |
|||
1
Pete
19.01.16
✎
14:00
|
код полностью:
Процедура КнопкаВыполнитьНажатие(Кнопка) Conn = Новый COMObject("ADODB.Connection"); Conn.ConnectionString = "Driver=Firebird/InterBase(r) driver;" + "Dbname="+АдресБазы+";" "UID=SYSDBA;PWD=masterkey;" + "CHARSET=WIN1251"; //"CHARSET=UTF8"; Conn.ConnectionTimeout = 180; Conn.CursorLocation = 3; Conn.Open(Conn.ConnectionString); RecordSet = Новый COMObject("ADODB.Recordset"); RecordSet.ActiveConnection = Conn; RecordSet.CursorType = 1; RecordSet.LockType = 3; RecordSet.Open(«SELECT * FROM STAFF», Conn); лЧислоКолонок = RecordSet.Fields.Count; Если лЧислоКолонок > 0 Тогда Результат = Новый ТаблицаЗначений; Для i=0 По лЧислоКолонок-1 Цикл Результат.Колонки.Добавить(RecordSet.Fields(i).Name); КонецЦикла; Пока RecordSet.EOF() = 0 Цикл Запись = Результат.Добавить(); Для i=0 По лЧислоКолонок-1 Цикл Запись[i] = RecordSet.Fields(i).Value; КонецЦикла; RecordSet.MoveNext(); КонецЦикла; RecordSet.Close(); КонецЕсли; RecordSet=""; Conn.Close(); ЭтаФорма.ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки(); КонецПроцедуры |
|||
2
Pete
19.01.16
✎
14:00
|
пример возвращаемого:
ID_STAFF LAST_NAME FIRST_NAME MIDDLE_NAME TABEL_ID PORTRET DATE_BEGIN 41 801 Носков Кирилл Алексеевич 46 COMSafeArray 01.01.2008 0:00:00 |
|||
3
Aloex
19.01.16
✎
14:01
|
Измени строку подключения.
|
|||
4
Aloex
19.01.16
✎
14:02
|
В ней укажи кодировку.
|
|||
5
vde69
19.01.16
✎
14:03
|
надо применить CHARSET=WIN1251 для рекорд сета
|
|||
6
Aloex
19.01.16
✎
14:09
|
(0) Этого достаточно: СоединениеADO = Новый COMОбъект("ADODB.Connection");
Убери рекордсет. |
|||
7
Pete
19.01.16
✎
15:01
|
(5) Не обнаружил для Recordset свойства CHARSET
http://www.glasda.ru/recordset.htm#CursorType https://msdn.microsoft.com/en-us/library/ms675841(v=vs.85).aspx Приведите, пожалуйста, пример. |
|||
8
Pete
19.01.16
✎
15:03
|
(6) Поясните, как без рекордсета (или прочих аналогичных объектов) получить данные, выполнив необходимый запрос?
|
|||
9
Kolls
19.01.16
✎
15:05
|
Из IBExperta или подобной приблуды в какой кодировке видны русские символы?
|
|||
10
Pete
19.01.16
✎
15:05
|
(4) Conn.ConnectionString = "Driver=Firebird/InterBase(r) driver;" +
"Dbname="+АдресБазы+";" "UID=SYSDBA;PWD=masterkey;" + "CHARSET=WIN1251"; Это, собственно, и есть строка подключения и в ней указана кодировка |
|||
11
Pete
19.01.16
✎
15:06
|
(9) Из IBExperta русские символы? В настройках подключения указана кодировка UTF8.
|
|||
12
Pete
19.01.16
✎
15:06
|
(9) Из IBExperta русские символы видны. В настройках подключения указана кодировка UTF8.
|
|||
13
Kolls
19.01.16
✎
15:08
|
ок, посмотри кодировку в самой таблице, блин, правда забыл где именно, но попробуй получить скрипт создания таблицы, там будет указана кодировка, если она отлична от основной кодировки базы.
|
|||
14
vde69
19.01.16
✎
15:21
|
что-то типа того (но детально нужно разбиратся):
RecordSet.ActiveConnection.CHARSET="WIN1251" это стандартная засада когда параметры базы устанавливаются по дефолту каждому новому обьекту... а шарсет конекта - работает только на момент конекта (авторизации) я в свое время с мускулем колупасля с этим... |
|||
15
Pete
19.01.16
✎
15:24
|
(13) обнаружил в описании нужных мне полей, что Charset:NONE
|
|||
16
vde69
19.01.16
✎
15:25
|
(15) это значит дефолтные из базы, если и в базе пусто - то с сервера
|
|||
17
Pete
19.01.16
✎
15:25
|
Что теперь с ними, болезными, делать?
Править саму базу - не вариант. Стороннее решение. Они нас обвиняют во всех смертных грехах. |
|||
18
ObjectRelation Model
19.01.16
✎
15:27
|
(17) заставить их править базу ))
|
|||
19
vde69
19.01.16
✎
15:30
|
попробуй так
Conn = Новый COMObject("ADODB.Connection"); Conn.ConnectionString = "Driver=Firebird/InterBase(r) driver;" + "Dbname="+АдресБазы+";" "UID=SYSDBA;PWD=masterkey;" + "CHARSET=NONE"; |
|||
20
Pete
19.01.16
✎
18:06
|
(19) безрезультатно. Причем результат одинаковый, какую кодировку ни указывай (проверял на UNICODE_FSS, CP943C, WIN1251)
на кодировке OCTETS выходит ошибка: Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [ODBC Firebird Driver]bad parameters on attach or create database CHARACTER SET OCTETS is not defined на DOS860 и ASCII: Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [ODBC Firebird Driver][Firebird]arithmetic exception, numeric overflow, or string truncation Cannot transliterate character between character sets Но всё это уже после того как я добавил новое поле в таблицу с кодировкой UTF8 и скопировал в него поле LAST_NAME. Так вот внешний вид содержимого нового поля меняется в зависимости от кодировки! А нужных полей - нет! |
|||
21
Карупян
19.01.16
✎
18:08
|
судя по РќРѕСЃРєРѕРІ - это утф
|
|||
22
Карупян
19.01.16
✎
18:09
|
которую читают как анси
|
|||
23
Карупян
19.01.16
✎
18:13
|
может драйвер на понимает утф. как было у старых версий мускула?
|
|||
24
Pete
20.01.16
✎
09:29
|
(23) Новое поле, которое я создал с кодировкой UTF8 и скопировал в него информацию из "неразборчивого", читается драйвером прекрасно.
Вопрос в том, как прочитать данные из поля, для которого разработчик указал кодировку NONE? |
|||
25
Woldemar177
20.01.16
✎
09:36
|
(24) Тоже поставь NONE. Разработчик на дельфи писал?
|
|||
26
Pete
20.01.16
✎
10:13
|
(25) Поставил NONE. Не помогает. Результат такой же как и при WIN1251, UTF8, UNICODE_FSS: поле с кодировкой NONE нечитабельно "РќРѕСЃРєРѕРІ", поле с кодировкой UTF8 выводится корректно "Носков".
На чем писал разработчик не знаю (СКУД PERCo-S-20 https://www.perco.ru/). Как определить и что от этого зависит? Существуют ли другие способы обратиться к базе Firebird? |
|||
27
T1C
20.01.16
✎
10:16
|
А если сконвертировать базу в UTF с помощью этого?
Функции ESF Database Migration Toolkit: » Интерфейс пошагового мастера, который позволит проделать все операции за 4 шага » Поддержка множества известных баз данных, включая MySQL, Oracle, PostgreSQL и другие <b>» Возможность конвертации между базами данных » Поддержка Юникода и автоматическая конвертация между различными кодировками</b> » Очень быстрая скорость обработки данных » И многие другие возможности |
|||
28
Pete
20.01.16
✎
10:29
|
(14) вариант не подходит
RecordSet.ActiveConnection.CHARSET="WIN1251" {Форма.Форма.Форма(23)}: Ошибка при установке значения атрибута контекста (CHARSET) RecordSet.ActiveConnection.CHARSET="WIN1251"; по причине: Нет поименованных аргументов Кроме того "а шарсет конекта - работает только на момент конекта (авторизации) я в свое время с мускулем колупасля с этим..." не верно в данном случае (возможно, верно для MySQL). При смене кодировки в строке подключения на "CP943C" в поле с кодировкой UTF8 получаем "„N„Ђ„ѓ„{„Ђ„r" вместо привычного для WIN1251, UTF8 и UNICODE_FSS "Носков". Т.е. кодировка в строке подключения оказывает влияние на кодировку используемую в Recordset. |
|||
29
Pete
20.01.16
✎
10:35
|
(27) вариант не подходит, т.к. база "живая" и конвертация идет вразрез с понятием "поддержка" от поставщика СКУД, равно как и обращение напрямую к базе. ))
Да и если говорить про конвертацию, то, как я писал в (24), достаточно скопировать нужные поля в новые поля с кодировкой UTF8. При желании можно удалить старые поля с кодировкой NONE и создать из заново с нужной кодировкой. Только неизвестно как будет с такой базой работать ПО поставщика и наверняка первое же "Исправить и реиндексировать БД" в ПО поставщика всё вернёт "на свои места". |
|||
30
Aloex
20.01.16
✎
10:43
|
(8) Как то так:
Conn = Новый COMObject("ADODB.Connection"); Conn.ConnectionString = "Driver=Firebird/InterBase(r) driver;" + "Dbname="+АдресБазы+";" "UID=SYSDBA;PWD=masterkey;" + "CHARSET=WIN1251"; Conn.Open(); Результат = Conn .Execute(ТекстЗапроса); Пока ВыборкаСтрокADO.EOF = 0 Цикл |
|||
31
Aloex
20.01.16
✎
10:44
|
(30)+ пардон
ВыборкаСтрокADO = Conn .Execute(ТекстЗапроса); Пока ВыборкаСтрокADO.EOF = 0 Цикл |
|||
32
Pete
20.01.16
✎
11:33
|
(31) работает, но результат тот же
"РќРѕСЃРєРѕРІ" для поля в кодировке NONE "Носков" для поля в кодировке UTF8 |
|||
33
Pete
20.01.16
✎
11:34
|
(32) + в строке подключения указывал "CHARSET=UTF8";
|
|||
34
Карупян
20.01.16
✎
11:34
|
(32) есть запасной вариант конвертить РќРѕСЃРєРѕРІ уже в 1с )))
|
|||
35
Pete
20.01.16
✎
11:36
|
(34) какие есть "элегантные" способы для этого?
|
|||
36
ObjectRelation Model
20.01.16
✎
11:42
|
лучше задай вопрос тут http://www.sql.ru/forum/interbase
|
|||
37
Aloex
20.01.16
✎
11:45
|
(32) Это решается строкой(настройка) соединения. У самого была такая же проблема. Играйся с кодировкой.
|
|||
38
trdm
20.01.16
✎
11:59
|
(34) +1
Причем врукопашную с помощью: http://www.artlebedev.ru/tools/decoder/ |
|||
39
Woldemar177
20.01.16
✎
12:26
|
(26) Дружок писал ODBC manager, я им пользуюсь.
(36) Они там на всю голову ужаленные. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |