Thema: Delphi SQL und Umlaute

Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: SQL und Umlaute

  Alt 10. Mär 2004, 10:56
Zitat von Klaus D.:
unabhängig der Schreibweise soll der Datensatz gefunden werden.
aber mit Umlauten hat mein Code Probleme ? wieso weshalb warum ??
Damit dies funktioniert, müsste die Datenbank wissen, welchen Zeichensatz du
verwendest und ob Gross-/Kleinschreibung als gleich oder ungleich
betrachtet werden soll.
Der MS SQL Server 2000 verwendet hierfür sogenannte Collations.
(siehe Online-Help zum SQL Server Stichwort COLLATE)

Wenn man sich unabhängig von der Datenbank machen möchte, muss
man Schattenfelder in den Tabellen speichern.

Hier ein Beispiel:
Delphi-Quellcode:
   Table1['Fabrikat'] := 'Ferrari';

   // auf das Schattenfeld schreiben.
   // alle Schattenfeld tragen den Postfix "_MC" für "MatchCode"
   Table1['Fabrikat_MC'] := AnsiUpperCase(KonvertSonderzeichen(Table1['Fabrikat']));
Hier die Funktion KonvertSonderzeichen:
Delphi-Quellcode:
function KonvertSonderzeichen(const s: string): string;
var
   i,slen: integer;
   src,dst: PChar;
begin
   slen := Length(s);
   SetLength(Result, slen * 2); // Ergebnis kann u.U. doppelt so groß

   if slen = 0 then
      Exit;

   src := PChar(@s[1]);
   dst := PChar(@Result[1]);

   for i := 1 to slen do
   begin
      case src^ of
         'ä': begin dst[0] := 'a'; dst[1] := 'e'; Inc(dst); end;
         'ö': begin dst[0] := 'o'; dst[1] := 'e'; Inc(dst); end;
         'ü': begin dst[0] := 'u'; dst[1] := 'e'; Inc(dst); end;
         'Ä': begin dst[0] := 'A'; dst[1] := 'E'; Inc(dst); end;
         'Ö': begin dst[0] := 'O'; dst[1] := 'E'; Inc(dst); end;
         'Ü': begin dst[0] := 'U'; dst[1] := 'E'; Inc(dst); end;
         'ß': begin dst[0] := 's'; dst[1] := 's'; Inc(dst); end;

         'à','á','â','ã','å': begin dst^ := 'a'; end;
         'À','Á','Â','Ã','Å': begin dst^ := 'A'; end;

         'è','é','ê','ë': begin dst^ := 'e'; end;
         'È','É','Ê','Ë': begin dst^ := 'E'; end;

         'ì','í','î','ï': begin dst^ := 'i'; end;
         'Ì','Í','Î','Ï': begin dst^ := 'I'; end;

         'ò','ó','ô','õ': begin dst^ := 'o'; end;
         'Ò','Ó','Ô','Õ': begin dst^ := 'O'; end;

         'ù','ú','û': begin dst^ := 'u'; end;
         'Ù','Ú','Û': begin dst^ := 'U'; end;

         'ñ': begin dst^ := 'n'; end;
         'Ñ': begin dst^ := 'N'; end;

         'ý','ÿ': begin dst^ := 'y'; end;
         'Ý': begin dst^ := 'Y'; end;

         'ç': begin dst^ := 'c'; end;
         'Ç': begin dst^ := 'C'; end;

         '°': begin dst^ := 'o'; end; // Bernc#18.12.03
      else
         dst^ := src^;
      end;

      Inc(dst);
      Inc(src);
   end;

   SetLength(Result, dst-PChar(@Result[1]));
end;
Falls deine Datenbank UDFs (User Defined Functions) unterstützt, dann kann
evtl. auf die Schattenfelder verzichtet werden.

Statt
WHERE (Fabrikat_MC like :param1) schreibt man dann:
WHERE (UDF_KonvertSonderzeichen(Fabrikat_MC) like :param1)
Andreas
  Mit Zitat antworten Zitat