Как изменить кодировку существующей базы данных для Interbase - PullRequest
2 голосов
/ 22 августа 2010

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

upper('åäö')

сгенерировать 'ääö'. Это должно быть «ÄÄÖ». Это шведские символы, которые отсутствуют в английском алфавите.

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

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

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

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

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

РЕДАКТИРОВАТЬ: Как сказал Крейг, нет никакого реального способа, кроме как скопировать данные, которые знают кодировку. Поэтому я выбираю другой путь.

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. Возможно, не самое лучшее решение, но я думаю, что оно работает.

Ответы [ 3 ]

4 голосов
/ 15 сентября 2010

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

3 голосов
/ 23 августа 2010

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

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

1 голос
/ 26 октября 2016
update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8'
...