Имя: Пароль:
1C
1С v8
Запрос к 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) Они там на всю голову ужаленные.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.