Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Abfrage mit Delphi XE3 und Sonderzeichen (https://www.delphipraxis.net/180812-mysql-abfrage-mit-delphi-xe3-und-sonderzeichen.html)

AndreDXE3 19. Jun 2014 15:47

Datenbank: MySQL • Version: 5.1 • Zugriff über: Delphi XE3

MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
Hi,
ich hoffe, mir kann hier jemand helfen.

Ich hab MySQL installiert, MySQL Workbench, und hab Delphi XE3 zu laufen. MySQL 5.1, weil neuere Versionen anscheinend nicht mit Delphi XE3 laufen.

Ich hab in der Datenbank Namen mit Sonderzeichen: Marie Geneviève z.B.

Ich hab in der Datenbank alle Zeichensätze auf UTF8 gestellt.
Wenn ich in der Workbench nach Marie Geneviève suche
select * from xxx where forename="Marie Geneviève";
krieg ich die entsprechende richtige Antwort.

setze ich dieselbe Suche mit Delphi XE3 ab, krieg ich als Antwort, daß es keine solchen Datensätze gibt.

Ich hab schon diverse Lösungsversuche probiert, wie

procedure XSQLConnectionAfterConnect(
Sender: TObject);
begin
XSQLConnection.ExecuteDirect('set names utf8;');
XSQLConnection.ExecuteDirect('set character set utf8;');
end;

oder das Umwandeln der Abfrage

tempClientDataSet.Active:=False;
sql2:='select * from xxx where forename="Marie Geneviève";';
sqlstring:=AnsitoUTF8(sql2); // diverse andere Versionen probiert
tempSQLDataSet.CommandText := sqlstring;
tempClientDataSet.Active:=True;

Leider hat davon nichts geklappt.
Frage wäre:
Wo muß man was einstellen, damit eine Abfrage mit UTF8-Sonderzeichen auch als UTF8 am Server ankommt?
oder Alternativ
gibt es eine Funktion, mit der man die Abfrage so umwandeln kann, damit eine Abfrage herauskommt, die vom Server verstanden und richtig beantwortet wird?
eine Idee wäre z.B., wenn aus

select * from xxx where forename="Marie Geneviève";

ein

select * from xxx where forename="Marie Genevieve";

würde, also die Sonderzeichen durch kompatible ASCII-Zeichen ersetzt würden.
Die Lösung mit der Funktion

function Ansi2Ascii(const s:AnsiString):AnsiString;
begin
Result := s;
if Result <> '' then
begin
UniqueString(Result);
CharToOem(Pchar(Result), Pchar(Result));
end;
end;

funktioniert übrigens nicht, da bei DelphiXE3 diverse Char und string-Varianten nicht mehr kompatibel zueinander sind (wie es z.B. bis Delphi2010 noch war)

Für Vorschläge wäre ich sehr dankbar.

sx2008 19. Jun 2014 18:25

AW: MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
Deine Abfrage ist übrigens nicht ganz richtig.
String-Literale werden in einfache Hochkommas eingeschlossen.
Feld- und Tabellennamen können in doppelte Anführungszeichen eingeschlossen werden.
Vielleicht ist die MySQL Workbench ja so schlau und erkennt dass "Marie Geneviève" kein Feldname sondern ein String sein soll aber die ADO, ODBC oder SQL-Direct Treiber können das nicht.

AndreDXE3 19. Jun 2014 18:53

AW: MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
da in delphi die strings selbst in einfache Hochkommas eingeschlossen sind, kann ich entweder innerhalb dieser Hochkommas die strings mit Doppel-Hochkomma oder mit chr(39) einklammern; bei Version 1 kann ich den string direkt in die workbench kopieren, und krieg eine funktionierende Abfrage, bei Version 2 geht das nicht; (bei excel werden strings mit Doppel-Hochkomma umschlossen, also nehm ich dort als Begrenzung einfache Hochkomma)
solange ich KEINE SONDERZEICHEN nutze, funktionieren mit delphi beide Funktionen, und geben das richtige Ergebnis aus; benutze ich Sonderzeichen, funktioniert keine der beiden Versionen

mkinzler 19. Jun 2014 18:57

AW: MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
Schon mal mit (SQL-)Paramter versucht?

DeddyH 19. Jun 2014 19:03

AW: MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
Kann man das nicht mal pinnen?

mkinzler 19. Jun 2014 19:05

AW: MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
Zitat:

Zitat von DeddyH (Beitrag 1262930)
Kann man das nicht mal pinnen?

Oder als automatische Anwort auf alle Datenbankfragen bzw. automatische Rückfrage: "Verwenden Sie (SQL-)Parameter?"; wenn nicht: "Warum?"
:mrgreen:

AndreDXE3 19. Jun 2014 19:47

AW: MySQL Abfrage mit Delphi XE3 und Sonderzeichen
 
Zitat:

Zitat von mkinzler (Beitrag 1262931)
Zitat:

Zitat von DeddyH (Beitrag 1262930)
Kann man das nicht mal pinnen?

Oder als automatische Anwort auf alle Datenbankfragen bzw. automatische Rückfrage: "Verwenden Sie (SQL-)Parameter?"; wenn nicht: "Warum?"
:mrgreen:

die genaue Abfrage, die ich brauche, ist sowas wie
where forename in ("Marie Geneviève","xxx",...,"xxyz");

der eine Name davon ist direkt aus der Datenbank, würde also als Parameter per where-clausel übergeben werden können; die weiteren Namen ergeben sich aus String-Operationen aus dem ersten Namen; also hab ich doch wieder das Problem, daß ich irgendeinen string mit Sonderzeichen nutzen muß ...
falls mit SQL-Parametern irgendeine where-clausel gemeint ist ...

Edit: da ich bei Ihrem Namen grad was von XE6 sehe - XE3 kann nur MySQL mit dem richtigen veralteten 32-Bit-MySQL-Treiber + veralteter MySQL-Version - ist das bei XE6 jetzt anders?

Edit2:
hab jetzt mal mit

tempClientDataSet.Params.CreateParam(ftString, 'forename', ptInput);

tempClientDataSet.Params.ParamByName('forename').A sString := 'Marie Geneviève';
sqlstring:='SELECT * FROM xxx;';
tempSQLDataSet.CommandText := sqlstring;

den richtigen Datensatz gekriegt, mit einer zweiten Abfrage dann den nächsten;
gibt es mit Parametern auch die Möglichkeit, statt einer =-Abfrage von Feldern eine in- oder eine like-Abfrage abzuschicken?

Bei einem Versuch mit
tempClientDataSet.Params.CreateParam(ftString, 'forename1', ptInput);
tempClientDataSet.Params.CreateParam(ftString, 'forename2', ptInput);
...
sqlstring:='SELECT * FROM xxx where forename in (:forename1,:forename2);';

kam leider nicht das Gewünschte heraus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz