Autor Beitrag
icho2099
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Di 15.02.22 19:29 
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 user profile iconTh69: Delphi-Tags hinzugefügt
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 762
Erhaltene Danke: 127



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: 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.



ausblenden volle Höhe 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+}
//{$MODE DELPHI}



interface

uses
  Classes
  , SysUtils
  , Forms
  , Controls
  , StdCtrls
  , ZConnection
  , ZDataset


  ;

type

  { TForm1 }

  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}

{ TForm1 }

procedure TForm1.BtnDoItClick(Sender: TObject);
begin
  EDOut.Clear;
  MemoOut.Clear;

  //Edit/Memo --> DB
  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;
  //DB --> edit/Memo
  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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 17.02.22 12:13 
Wie sieht denn dein Connection-String aus? Hast du dort CharSet=utf8; verwendet?
leioosmalre
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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 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.