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