Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi UTF wird beim Speichern konvertiert (https://www.delphipraxis.net/56469-utf-wird-beim-speichern-konvertiert.html)

xaromz 6. Nov 2005 13:12

Datenbank: MySQL • Version: 5 • Zugriff über: DBExpress

UTF wird beim Speichern konvertiert
 
Hallo,
ich habe folgendes Problem: Wenn ich einen WideString nach UTF8 konvertiere und diesen dann in einem varchar-Feld speichere verändert mySQL meine Daten. Wenn ich z. B. das Zeichen "fi" (WideChar #64257) speichere, so ist das in UTF #239#172#129. Das Zeichen #129 erscheint im Datenbankfeld aber als #63 (Fragezeichen). Das ist wohl das Standardzeichen für unbekannte Zeichen.
Ich kann den Fehler vermeiden, wenn ich das Feld von varchar auf varbinary umstelle, aber dann kann ich keinen Index darüber erstellen.
Gibt es da noch eine andere Möglichkeit oder muss ich mich damit abfinden?

Gruß
xaromz

marabu 6. Nov 2005 16:43

Re: UTF wird beim Speichern konvertiert
 
Hallo xaromz,

von der Versionsnummer her kannst du ab MySQL 4.1 Unicode verarbeiten. Hast du deine varchar Felder in der Tabelle entsprechend deklariert? Sind deine dbExpress-Komponenten überhaupt Unicode-tauglich?

Grüße vom marabu

xaromz 6. Nov 2005 17:09

Re: UTF wird beim Speichern konvertiert
 
Hallo,

klar hab ich die varchar-Felder als Unicode deklariert. Und weil DBExpress eben kein Unicode kann benutze ich UTF8.

Gruß
xaromz

marabu 6. Nov 2005 17:18

Re: UTF wird beim Speichern konvertiert
 
UTF-8 ist Unicode - genauso wie UTF-16 und UTF-32.

marabu

xaromz 6. Nov 2005 18:54

Re: UTF wird beim Speichern konvertiert
 
Hallo,

UTF8 ist nicht Unicode, in UTF8 wird Unicode codiert. Deshalb ist in UTF8 auch die Acht drin, es kodiert die Mehrbyte-Zeichen in Ein-Byte-Zeichen, d. h. es kommen im codierten String nur Bytes von 1 bis 255 vor und niemals die Null, was bei Unicode passieren kann.

Gruß
xaromz

marabu 6. Nov 2005 19:20

Re: UTF wird beim Speichern konvertiert
 
Interessante Sichtweise. Das Unicode Konsortium selbst ist der Meinung, dass es sich bei Unicode um ein abstraktes Konzept handelt, bei dem jedem registrierten Zeichen eine Nummer zugeordnet wird. Damit dein Programm mit Unicode arbeiten kann, bedarf es einer Repräsentation. Geläufig sind UTF-8, UTF-16 und UTF-32. Nur damit wir die gleiche Sprache sprechen. Aus dem offiziellen FAQ zum Thema:

Zitat:

Q: Can Unicode text be represented in more than one way?

A: Yes, there are several possible representations of Unicode data, including UTF-8, UTF-16 and UTF-32.
Zurück zu deinem anderen Problem. Der bei D7 und D8 mitgelieferte dbExpress beherrscht nur single byte character encodings. Wenn du ihm da aus UTF-8 resultierende illegal characters unterjubelst, gibt es Probleme. Du weißt das und wunderst dich trotzdem? Wie kann man dir da helfen?

Freundliche Grüße vom marabu

xaromz 6. Nov 2005 19:30

Re: UTF wird beim Speichern konvertiert
 
Hallo,

einigen wir uns also darauf, dass UTF8 eine Repräsentation ist.

Ich übergebe DXExpress einen String, in dem Bytewerte zwischen eins und 255 vorkommen. Dies sind keine illegalen Zeichen. Mein Problem ist, dass MySQL die Zeichen interpretiert. Abhängig von der Codierung, die ich wähle, erkennt MySQL Zeichen als illegal (wie z. B. das Zeichen 129) und ersetzt diese durch ein Fragezeichen. Ich müsste also wissen, welche Codierung einzustellen ist, damit MySQL alle Bytewerte in Ruhe lässt und einfach in die Datenbank schreibt. Wie gesagt, mit Binary geht das, aber dann kann ich keinen Index mehr erstellen. Wenn ich aber in der Datenbank suche, ist das doch von Vorteil.

Gruß
xaromz

marabu 6. Nov 2005 20:46

Re: UTF wird beim Speichern konvertiert
 
Ich weiß nicht wie du darauf kommst, dass MySQL deine Daten verändert. Ich habe folgendes mit MySQL 4.1.10 getestet.

SQL-Code:
CREATE TABLE test ( txt VARCHAR(10) CHARACTER SET UTF8 )

INSERT INTO test VALUES(x'efac81')

SELECT COUNT(*) FROM test WHERE txt = x'efac81'
Die Daten werden unverändert gespeichert. Vielleicht bringt es dich ja weiter auf dem Weg der Erkenntnis, ich muss jetzt ins Bettchen.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 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