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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
hioctane
Сообщения: 3
Зарегистрирован: 22 сен 2011, 04:34

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

Сообщение hioctane » 22 сен 2011, 05:19

Придется начать издалека.

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

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

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вное где я допустил косяк?

Спасибо!

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

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

Сообщение dimitr » 22 сен 2011, 09:58

про копировании из чарсета NONE (хоть в UTF8, хоть куда угодно) перекодирования никогда не происходит, ибо неизвестна исходная кодировка

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение kdv » 22 сен 2011, 14:02

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

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

hioctane
Сообщения: 3
Зарегистрирован: 22 сен 2011, 04:34

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

Сообщение hioctane » 23 сен 2011, 01:30

Спасибо за инфо.

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

hioctane
Сообщения: 3
Зарегистрирован: 22 сен 2011, 04:34

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

Сообщение hioctane » 23 сен 2011, 01:37

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 да и настораживает что не было обновлений с момента публикации.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение kdv » 23 сен 2011, 03:05

dimitr уже ответил. достаточно коннекта с чарсетом NONE, из ЛЮБЫХ компонент или инструмента.

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

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

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

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

Сообщение dimitr » 23 сен 2011, 08:41

обновление 2.5 уже месяц как в публичном тестировании

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

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

Сообщение hvlad » 23 сен 2011, 10:32

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

Ответить