У нас есть база данных, и наш клиент написан на Delphi 2007. Используется последняя версия Interbase 2009. База данных старая, я думаю, она была создана примерно в 2002 году и сейчас занимает более 25 ГБ. Недавно я обнаружил, что в IBConsole
upper('åäö')
сгенерировать 'ääö'. Это должно быть «ÄÄÖ». Это шведские символы, которые отсутствуют в английском алфавите.
Я искал предмет и нашел эту ссылку .
Важная часть:
Как изменить символ по умолчанию
Набор существующей базы данных? Есть
нет поддерживаемого способа сделать это. Вы
следует воссоздать базу данных из
метаданные.
Этот блог был написан Крейгом Штунцем 2004-06-29. Я надеюсь, что с тех пор Interbase эволюционировал, и есть способ изменить набор символов для Interbase 2009 без особых усилий. Если это невозможно, можно ли это сделать из файла резервной копии gbk? Последний вариант - создать совершенно новую базу данных с правильным набором символов и каким-то образом выкачивать данные из старой.
Итак, у меня есть 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. Возможно, не самое лучшее решение, но я думаю, что оно работает.