Как изменить набор символов существующей базы данных для Interbase

У нас есть база данных, и наш клиент написан на Delphi 2007. Используется последняя версия Interbase 2009. База данных старая, я думаю, она была создана примерно в 2002 году и сейчас ее размер превышает 25 ГБ. Недавно я обнаружил, что в IBConsole

upper('åäö')

генерировать 'åäö'. Должно быть "ÅÄÖ". Это шведские символы, которых нет в английском алфавите.

Я провел поиск по этой теме и нашел эту ссылку. Важная часть:

Как я могу изменить набор символов по умолчанию для существующей базы данных? Нет поддерживаемого способа сделать это. Вы должны воссоздать базу данных из метаданных.

Этот блог был написан Крейгом Стунцем 29 июня 2004 г. Я надеюсь, что с тех пор Interbase развилась, и есть способ изменить набор символов для Interbase 2009 без особых усилий. Если это невозможно, можно ли это сделать из файла резервной копии gbk? Последний вариант — создать совершенно новую базу данных с нужным набором символов и каким-то образом выкачать данные из старой.

Итак, у меня есть 2 вопроса.

  1. Как проще всего изменить набор символов?
  2. Какой набор символов я должен выбрать, чтобы иметь upper('åäö') = 'ÅÄÖ'

EDIT: Как сказал Крейг, нет другого способа, кроме копирования данных, которые знают кодировку. Поэтому я выбираю другой путь.

vName := AnsiUpperCase(Nametosearch);
MakeCharLowercase(vName, 'åäö');
// Then use vName when search in database.

procedure TDuplicateDeptForm.MakeCharLowercase(var aName: String; aCharSet: String);
var
  vIndex, i: Integer;
  vChar: String;
begin
  for i := 1 to Length(aCharSet) do
  begin
    vChar := AnsiUpperCase(aCharSet[i]);
    repeat
      vIndex := AnsiPos(vChar, aName);
      if vIndex > 0 then
        aName[vIndex] := AnsiLowerCase(vChar)[1];
    until vIndex = 0;
  end;
end;

Это просто конвертирует шведские символы обратно в нижний регистр, так как это результат, который я получаю от Interbase. Возможно, не самое красивое решение, но я думаю, что оно работает.


person Roland Bengtsson    schedule 22.08.2010    source источник


Ответы (2)


Для шведского используйте ISO-8859-1 или UNICODE. Я не знаком с каким-либо новым способом изменить кодировку по умолчанию в существующих БД в IB 2009. Когда вы подумаете о том, что происходит, вы увидите, что вам все равно придется воссоздавать БД; вы бы изменили формат хранения всего текста в БД!

Самый простой способ перекачки данных — это, вероятно, специальная перекачка данных, такая как в DB Workbench. Для этого вам нужна версия «Pro», но есть бесплатная пробная версия, чтобы проверить, работает ли она. Опять же, учтите, что вы не сможете просто напрямую скопировать данные; вам придется сделать это с учетом кодировки. Вот почему вы всегда должны покупать инструмент управления БД у европейца. :)

person Craig Stuntz    schedule 23.08.2010
comment
Это был ответ, которого я боялся... Но когда создавалась эта база данных, никто не думал о таких вещах, как наборы символов. Наверное, это был полный труд, чтобы просто заставить приложение работать :-) Но такова жизнь. Мне удалось обойти это, но было бы лучше иметь правильную кодировку в БД. - person Roland Bengtsson; 23.08.2010

Существует бесплатная утилита командной строки под названием FBClone: ​​она может воссоздать вашу базу данных, изменив набор символов. В проекте используются компоненты UIB, поэтому он может использовать Interbase или Firebird. http://code.google.com/p/fbclone/

person Henri Gourvest    schedule 15.09.2010
comment
Это была очень интересная новость для меня. Есть ли у вас какие-либо сведения об успешном преобразовании БД для InterBase 2009 с набором символов? - person Roland Bengtsson; 16.09.2010
comment
Не лично, но я использовал эту утилиту для переноса моей базы данных Firebird на UTF8. Кодировка базы данных может отличаться от кодировки, используемой для подключения к базе данных, в этом случае механизм базы данных транслитерирует автоматически. Идея этой утилиты состоит в том, чтобы позволить ядру базы данных выполнять транслитерацию, используя один и тот же набор символов для подключения к исходной базе данных и месту назначения. Я думаю, что вы использовали кодировку NONE, поэтому в вашем случае вам придется использовать кодировку NONE, чтобы ваши строки не изменялись! - person Henri Gourvest; 20.09.2010