Была база с БЛОБ полем:
Код: Выделить всё
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);
Код: Выделить всё
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
Засада началась когда выяснилось что бэкап невозможно восстановить - если попадаются такие символы 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вное где я допустил косяк?
Спасибо!