Страница 1 из 1

FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 22 сен 2011, 05:19
hioctane
Придется начать издалека.

Была база с БЛОБ полем:

Код: Выделить всё

CREATE DATABASE 'd:\GBAK_Issue\Data.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET NONE;

CREATE TABLE DMG (
    DMG_ID                         BIGINT NOT NULL,
    REASONSHALTED           BLOB SUB_TYPE 1);
И понадобилось сделать по этому полю case insensitive поиск который был реализован путем конвертации поля в character set UTF8 COLLATE UNICODE_CI вот таким скриптом:

Код: Выделить всё

CONNECT 'd:\GBAK_Issue\Data.fdb' USER 'SYSDBA' PASSWORD 'masterkey';

ALTER TABLE DMG ADD TEMP_REASONSHALTED  BLOB SUB_TYPE 1 character set UTF8 COLLATE UNICODE_CI;

UPDATE DMG SET TEMP_REASONSHALTED = REASONSHALTED;

ALTER TABLE DMG DROP REASONSHALTED;

ALTER TABLE DMG ADD REASONSHALTED  BLOB SUB_TYPE 1 character set UTF8 COLLATE UNICODE_CI;

UPDATE DMG SET REASONSHALTED = TEMP_REASONSHALTED;

ALTER TABLE DMG DROP TEMP_REASONSHALTED;

COMMIT WORK;
Вроде все сделано правильно и все работает уже давно и без проблем.

Да вот только оказалось что пользователи могу вводить в это поле данные из раширенной таблицы символов - вроде ‘ и ’ и тд.
Программа на D2009 и все это вводится и работает на ура, единственно что поиск пришлось подкрутить и добавить

Код: Выделить всё

REASONSHALTED LIKE CAST(:REASONSHALTED AS VARCHAR(1024) CHARACTER SET UTF8)
вместо

Код: Выделить всё

REASONSHALTED LIKE :REASONSHALTED
тк когда пользователи туда вводили эти самые ‘ и ’ запрос падал с ошибкой Malformed string.

Засада началась когда выяснилось что бэкап невозможно восстановить - если попадаются такие символы gbak просто пропускает эти записи (а их много).

Как это чинить не понятно, ну разве что в живой базе поменять проблемные символы на пробелы и сделать backup&restore (что не решает на самом деле ничего).
Или в самом бэкапе редактором поправить если база померла (страшно даже представить сколько времени это может занять).

И самое главное не понятно как же такое вообще могло произойти.

Я думал что вот при таком присваении:

Код: Выделить всё

UPDATE DMG SET TEMP_REASONSHALTED = REASONSHALTED; // BLOB SUB_TYPE 1 character set UTF8 COLLATE UNICODE_CI присваевается BLOB SUB_TYPE 1
Будет либо ошибка либо явная конвертация но этого не произошло.

Я кинул ниже пошаговый пример с базой с одной таблицей & записью.

http://clevercomponents.com/store/alex/GBAK_Issue.zip

Как вообще с этим боротся и глaвное где я допустил косяк?

Спасибо!

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 22 сен 2011, 09:58
dimitr
про копировании из чарсета NONE (хоть в UTF8, хоть куда угодно) перекодирования никогда не происходит, ибо неизвестна исходная кодировка

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 22 сен 2011, 14:02
kdv
при переходе на 2.1 с предыдущих версий нужно выполнять скрипт
http://www.ibase.ru/firebird/211/metadata_charset.htm

для 2.5 есть опции -fix...
www.ibase.ru/devinfo/gbak.htm

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 23 сен 2011, 01:30
hioctane
Спасибо за инфо.

Пара моментов:
1) А как вообще поступать в таком случае чтобы таких проблем не возникало?
2) Как так получается что с клиента взоможно вставить неправильные данные в такие UTF-8 поля?
Используется FIBPlus 6.9.9, компонент TpFIBDataset

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 23 сен 2011, 01:37
hioctane
kdv писал(а):при переходе на 2.1 с предыдущих версий нужно выполнять скрипт
http://www.ibase.ru/firebird/211/metadata_charset.htm

для 2.5 есть опции -fix...
http://www.ibase.ru/devinfo/gbak.htm
С метаданными все ОК - проблема с данными.

Про gbak -fix_fss_d я читал но 2.5 мы пока не планируем ставить, на наших тестах (на коленке) он был медленнее 2.1.3 да и настораживает что не было обновлений с момента публикации.

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 23 сен 2011, 03:05
kdv
dimitr уже ответил. достаточно коннекта с чарсетом NONE, из ЛЮБЫХ компонент или инструмента.

Вообще про gbak странно. казалось бы, даже если блоб "текстовый" (subtype 1), ему должно быть все равно.

p.s. из исходного письма убрал упоминание SEGMENT SIZE. В будущем прошу его не приводить.
http://www.ibase.ru/ibfaq.htm#bss

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 23 сен 2011, 08:41
dimitr
обновление 2.5 уже месяц как в публичном тестировании

Re: FB 2.1.3 - GBAK выдает ошибку Malformed string

Добавлено: 23 сен 2011, 10:32
hvlad
hioctane писал(а):2) Как так получается что с клиента взоможно вставить неправильные данные в такие UTF-8 поля?
В 2.5 уже не получается