powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / [Firebird 2.5] [IBExpert 2011.01.12] Точки (код h2E (46)) вместо русских букв
3 сообщений из 3, страница 1 из 1
[Firebird 2.5] [IBExpert 2011.01.12] Точки (код h2E (46)) вместо русских букв
    #37130681
Arbane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос: в таблице вместо русских букв точки. Причем это не конфликт отображения, пользуясь встроенным hex-редактором увидел, что в полях таблицы вместо русских букв символы "точка" (шестн. 2E или дес. 46). База данных и поля - charset = NONE, но большинство данных записываются из клиентов под Windows, поэтому сам работаю с базой в IBExpert'е с подключением с кодовой страницей 1251.

Подробнее:

Есть файл определенной структуры: просто строки подряд, с разделителями. Группы строк разделены символом с кодом 13, а сами строки - 10.

Есть запрос в базе на Firebird 2.5. В качестве инструмента использован IBExpert.

Запрос добавляет в таблицу строки, полученные при разборе блоба пришедшего в качестве параметра (этот самый файл, описанный выше).

Запрос:

Код: 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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
create or alter procedure KLADR_KLADR_ADD_DATA (
    USERNAME varchar( 20 ),
    USERPWRD varchar( 20 ),
    DATA BLOB_DATA)
returns (
    RESULT integer)
as
declare variable LINE BLOB_DATA;
declare variable NAME varchar( 40 );
declare variable SOCR varchar( 10 );
declare variable CODE varchar( 13 );
declare variable INDEX_ varchar( 6 );
declare variable GNINMB varchar( 4 );
declare variable UNO varchar( 4 );
declare variable OCATD varchar( 11 );
declare variable STATUS varchar( 1 );
declare variable STR varchar( 40 );
declare variable COUNTER integer;
begin
  select result from can_access(:username,:userpwrd,'admin', 1 ) into :result;
  if (result< 0 ) then
  begin
    suspend;
    exit;
  end

  result =  0 ;

  for select OUTPUTSTRING from splitstring(:data, ascii_char( 13 ))
    into :line
  do
    begin
        counter =  0 ;
        name = '';
        socr = '';
        code = '';
        index_ = '';
        gninmb = '';
        uno = '';
        ocatd = '';
        status = '';

        for select OUTPUTSTRING from splitstring(:line, ascii_char( 10 ))
          into :str
        do
          begin
            if (counter =  0 ) then name = :str;
            if (counter =  1 ) then socr = :str;
            if (counter =  2 ) then code = :str;
            if (counter =  3 ) then index_ = :str;
            if (counter =  4 ) then gninmb = :str;
            if (counter =  5 ) then uno = :str;
            if (counter =  6 ) then ocatd = :str;
            if (counter =  7 ) then status = :str;
            counter = counter +  1 ;
          end

        insert into kladr_kladr(name, socr, code, "INDEX", gninmb, uno, ocatd, status)
          values (:name, :socr, :code, :index_, :gninmb, :uno, :ocatd, :status);
        suspend; --для теста, чтобы добавить только одну запись в таблицу
        exit; --для теста, чтобы добавить только одну запись в таблицу
    end

  suspend;
end^


Вот определение таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE KLADR_KLADR (
    NAME     VARCHAR( 40 ),
    SOCR     VARCHAR( 10 ),
    CODE     VARCHAR( 13 ),
    "INDEX"  VARCHAR( 6 ),
    GNINMB   VARCHAR( 4 ),
    UNO      VARCHAR( 4 ),
    OCATD    VARCHAR( 11 ),
    STATUS   VARCHAR( 1 )
);

Если в запросе пройтись отладкой, можно увидеть что все строки существуют и читаемы. То есть в момент передачи параметров insert'у они все правильно выделены из файла. Например name = 'Адыгея', а socr = 'Респ'. Подтверждаем транзакцию, смотрим в таблицу, а там: name = '......', а socr = '....'

Как решал:
1. Пробывал соединятся с БД с разными кодировками (NONE, WIN1251)
2. Менял типы данных в таблице и в хранимой процедуре на BLOB'ы, а также менял charset.
3. Вводил доп. пременные, где делал преобразования из одного в другое (cast'ы).
4. Тестировал процедуру SPLITSTRING. Работает корректно, возвращает в читаемом виде куски того же файла.

Все это не оправдалось.

Код ХП SPLITSTRING

Код: 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.
create or alter procedure SPLITSTRING (
    INPUTSTRING BLOB_DATA,
    DIVIDERSTRING NAME)
returns (
    OUTPUTSTRING BLOB_DATA)
as
declare variable POS1 "INTEGER";
declare variable POS2 "INTEGER";
begin
  pos1 =  1 ;
  pos2 = position(dividerstring, inputstring);

  if (pos2 >  0 ) then begin
    while (pos2 >  0 ) do begin
      outputstring = substring(inputstring from pos1 for (pos2 - pos1));
      pos1 = pos2 +  1 ;
      pos2 = position(dividerstring, inputstring, pos1);
      suspend;
    end
  end
  if (pos2 =  0 ) then begin
    outputstring = substring(inputstring from pos1);
    suspend;
  end
end^


Ограничения на решения: так как другие клиенты и функции нормально работают с русскими буквами, мне очень желательно ничего там не менять (не страдать синдромом переустановки виндоус по любому поводу), а разобраться в сути и исправить.

Как это решать? В чем может быть проблема? Мучаюсь уже часа 4 :(
...
Рейтинг: 0 / 0
[Firebird 2.5] [IBExpert 2011.01.12] Точки (код h2E (46)) вместо русских букв
    #37130777
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точки появляются при попытке применить встроенный блоб-фильтр, преобразующий SUBTYPE BINARY к SUBTYPE TEXT. Домен BLOB_DATA как объявлен? Похоже где-то внутри процедуры KLADR_KLADR_ADD_DATA (или в таблице KLADR_KLADR) он считается текстовым, а внутри процедуры SPLITSTRING он считается бинарным. Сам домен не меняли часом?

глобальное решение - перекомпилировать все процедуры. Возможно стоит сделать домен текстовым блобом, если это сейчас не так.
...
Рейтинг: 0 / 0
[Firebird 2.5] [IBExpert 2011.01.12] Точки (код h2E (46)) вместо русских букв
    #37130797
Arbane
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за интересную идею.

Домен объявлен как:
Код: plaintext
1.
2.
CREATE DOMAIN BLOB_DATA AS 
BLOB SUB_TYPE  0  SEGMENT SIZE  80 

Проверил как объявлены поля в функции, стер, заново выставил. Очистил предварительно таблицу (для чистоты эксперимента). Перекомпилировал и выполнил KLADR_KLADR_ADD_DATA. Результат - опять точки. В самой таблице - одни VARCHAR'ы, как видно выше.

Как нибудь этот фильтр нельзя отключить? Я сам просто не вижу места где бы он мог сам проявится (неявно вызваться).
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / [Firebird 2.5] [IBExpert 2011.01.12] Точки (код h2E (46)) вместо русских букв
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]