Entwickler-Ecke
Sonstiges (FPC / Lazarus) / Linux API - UniCode Zeos MySQL Unverständnis
icho2099 - Di 15.02.22 19:29
Titel: UniCode Zeos MySQL Unverständnis
Hallo zusammen,
ich verzweifle an einer Merksamkeit, die sich mir nicht erschliessen will.
Ich habe ein tMemo dessen Inhalt mittels Zeos-Query in eine MySQL Tabelle in eine LongText Spalte geschrieben werden soll.
Den Inhalt des tMemo übergebe ich als String an einen Parameter der Query mit
ParamByName('xyz').AsString := Memo.Text.
Tippe ich 'äöüßÄÖÜ' in das Memo, wird genau das auch in der Tabelle gespeichert.
Tippe ich 'Öffnungsüberwachung' in das Memo wird statt dessen 'Öffnungsüberwachung' gespeichert.
Liest die Query diese Spalte und schreibt den String in das Memo, erhalte ich dort 'Öffnungsüberwachung'. Dagegen funktioniert
'äöüßÄÖÜ' völlig problemlos.
Die MySQL Tabelle hat latin1 als Charset.
Kann mir jemand auf die Sprünge helfen bitte? Warum werden die Umlaute mal korrekt und mal völlig verwurschtelt gespeichert?
Moderiert von Th69: Delphi-Tags hinzugefügt
ub60 - Di 15.02.22 23:46
Nur mal so als Frage:
Warum nimmst Du nicht utf-8 als Charset? Eventuell hilft das ja ...
ub60
icho2099 - Mi 16.02.22 17:01
@ub60 hab ich natürlich auch probiert, ändert sich aber nichts, nur die Zugriffszeiten werden extrem lang, warum auch immer.
Habe ein kleines Testprojekt gebastelt, das Schema und die TESTTABLE sind mit Charset
utf8mb4 angelegt.
Das Merkwürdige ist, dass 'Öffnungsüberwachung' nicht korrekt abgebildet wird, andere Worte mit Umlauten aber schon.
Bsp funktionert 'Öffnungüberwachung' (ohne das s) und auch 'Öffnungs-überwachung'.
Aber '
Äffnungsüberwachung' und '
Üffnungsüberwachung' funktionieren nicht.
Egal ob in der Connection-Komponente "AutoEncodeStrings" ein- oder ausgeschaltet ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95:
| unit UMain;
{$mode objfpc}{$H+}
interface
uses Classes , SysUtils , Forms , Controls , StdCtrls , ZConnection , ZDataset
;
type
TForm1 = class(TForm) BtnDoIt : TButton; EDIn : TEdit; EDOut : TEdit; MemoIn : TMemo; MemoOut : TMemo; ZConnection1 : TZConnection; QIn : TZQuery; QOut : TZQuery; Label1 : TLabel; procedure BtnDoItClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ZConnection1AfterConnect(Sender: TObject); private LID : Integer; public
end;
var Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.BtnDoItClick(Sender: TObject); begin EDOut.Clear; MemoOut.Clear;
With QIn do begin SQL.Clear; SQL.Add('INSERT INTO ANCA.TESTTABLE SET '); SQL.Add('KTEXT = :KTEXT, LTEXT = :LTEXT '); ParamByName('KTEXT').AsString := EDIn.Text; ParamByName('LTEXT').AsString := MemoIn.Text; ExecSQL; SQL.Clear; SQL.Add('SELECT last_insert_id() AS LID '); Open; LID := FieldByName('LID').AsInteger; Close; end; With QOut do begin SQL.Clear; SQL.Add('SELECT * FROM ANCA.TESTTABLE WHERE ID = :ID '); ParamByName('ID').AsInteger := LID; Open; EDOut.Text := FieldByName('KTEXT').AsString; MemoOut.Text := FieldByName('LTEXT').AsString; Close; end;
EDIn.SetFocus; end;
procedure TForm1.FormCreate(Sender: TObject); begin ZConnection1.Connected := True; end;
procedure TForm1.ZConnection1AfterConnect(Sender: TObject); begin Label1.Caption := 'Connected'; end; |
Verwende ich aber statt dessen die Konvertierung bei der Übergabe der Parameter
funktioniert es. Da muss es also irgendwo einen versteckten Konverter geben, der die
Konvertierung vom Inhalt abhängig macht, schon eigenartig.
Delphi-Quelltext
1: 2:
| ParamByName('KTEXT').AsUTF8String := EDIn.Text; ParamByName('LTEXT').AsUTF8String := MemoIn.Text; |
Bitte nicht über meine Formatierung oder "with" wundern, das ist halt so drin, in den Fingern
Th69 - Do 17.02.22 12:13
Wie sieht denn dein Connection-String aus? Hast du dort CharSet=utf8; verwendet?
leioosmalre - Do 28.12.23 12:11
Stellen Sie sicher, dass der richtige Zeichensatz verwendet wird, wenn Sie sich mit der MySQL-Datenbank verbinden. In Ihrem Fall sollte es 'latin1' sein, um mit der Tabelle kompatibel zu sein. Überprüfen Sie Ihre Datenbankverbindungseinstellungen. Stellen Sie sicher, dass der Zeichensatz des tMemo-Steuerelements in Ihrer Anwendung korrekt eingestellt ist. Er sollte ebenfalls 'latin1' sein, um sicherzustellen, dass die Zeichen korrekt in die Datenbank geschrieben werden. Die Überwachung von
https://priceva.com/de ist heutzutage eine große Sache. Daher müssen Sie dies in Ordnung bringen. Stellen Sie sicher, dass die Zeichenkodierung der gesamten Anwendung (z. B. Delphi-Anwendung) auf 'latin1' eingestellt ist. Dies kann die Zeichenkonvertierung zwischen der Anwendung und der Datenbank beeinflussen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!