Griechische Zeichen zur Datenbank übertragen

Hallo,

ich habe Probleme, griechische Zeichen an die MySQL-Datenbank zu übergeben.

In VB.NET arbeite ich mit DatabaseFactory und übergebe als DBCommand einen update mit einem String, der griechische Zeichen enthält. Die Spalte der Tabelle in der Datenbank habe ich mit Charecter set greek angelegt. Mit dem SQL-Browser kann ich die gr. Zeichen eingeben und sie dann auch zurückübertragen zu meinem VB-Programm. Nur zur Datenbank hin bekomme ich nur Fragezeichen.

Mit anderen Zeichen passiert dasselbe, etwa mit polnischen Sonderzeichen.

Ich wäre für jedwede Hinweise sehr dankbar.
Franz

Hi,
wie sind die Daten kodiert?
Lg Knerd

Hi Knerd,
mein Windows ist englisch, dann füge ich über Control Panel/Change Keyboards griechische und polnische Tastaturen zu, schalte auf eine dieser um, und dann kann ich z.B. griechische Zeichen in eine Textbox in Visual Basic eingeben. Den Inhalt dieser Textbox möchte ich dann zur MySQL-Datenbank übertragen.
Gruß,
Franz

Hallo!
So einfach wird das nichts.
Belies’ Dich vielleicht mal zum Thema „Unicode“.

Kurz gefasst: Früher dachte man mal, man braucht keine „fremden“ Zeichen dazustellen, also entstand der ASCII Zeichensatz mit 128/255 verschiedenen Zeichen und, weil es halt doch Leute gab, denen die Standardzeichen nicht reichten, es wurden sog. Charsets/Encodings definiert, die das Aussehen mancher Zeichen umdefinierten.

Bei den meisten Datenbanken ist dieses Vorgehen der Standard für Zeichenfelder. Wenn Du irgendwo ein CHAR(27) definiert hast, dann musst Du zur korrekten Darstellung auch immer noch wissen, welches Encoding in der DB eingestellt ist, weil sonst Dein ε oder ℵ oder auch schon ein ß nicht richtig dargestellt wird.
Mit „SHOW CHARACTER SET“ kannst Du das aktuelle Encoding abfragen.

Heutzutage sollte man auf jeden Fall mit Unicode arbeiten, damit kann in einer einzigen Zeichencodierung praktisch alles dargestellt werden, was es an Schriftzeichen auf unserem Planeten gibt.

Hier: http://dev.mysql.com/doc/refman/5.1/de/charset.html
findest Du mehr zum Thema.

Gruß,
Martin

Hallo Martin,

danke für die Tipps. Ich verwende Unicode. In den Tabellen ist jeweils utf8 angegeben. Ich setze dann nur für Spalten, die griechisch sein sollen, das Character set greek.

Ich verstehe, dass von Windows über eine sogenannte Codepage ein bestimmtes Character Set benutzt wird und die Strings, so wie ich sie in Windows habe, zur Datenbank übertragen werden. Dort muss ich sie dann in das utf8- oder in das greek-Format bringen. Wie mache ich das? Woher weiß die SQL-Prozedur, welches Character set Windows benutzt? Das sollte ich in einem „SET NAMES charset“ irgendwie angeben. Wie kann ich überhaupt feststellen, welches Character set mein Computer verwendet?

Sind meine Gedankengänge noch soweit richtig, oder habe ich dabei irgendwie einen Denkfehler?

Gruß,
Franz

Hallo nochmal!

Zeig’ doch bitte mal die relevanten Codeteile.
Wie ist eine Tabelle bei Dir definiert, die Unicodezeichen enthalten soll und wie greifst Du genau darauf zu?
Wenn Du bspw. in der Tabelle das Feld als CHAR(irgendwas) definiert hast, bedeutet das, dass dort normalerweise ASCII gespeichert werden soll.
Nur, wenn Du NCHAR(irgendwas) verwendest, wird standardmäßig Unicode genommen.

Alles in allem aber schwer zu sagen, was bei Dir genau schief läuft, ohne Code gesehen zu haben.

Gruß,
Martin

Hallo Martin,

ich brauche den Text nicht einmal zu speichern, um die Zeichen zu verlieren. Ich habe eine Stored-Procedure:

create procedure p(par varchar(33))
begin
select par;
end;

Aus VB.Net rufe ich sie auf, indem ich übertrage:

call p(„αβγ“); # alpha, beta, gamma

Zurück kommt: ???

Gruß FraLang

Hallo!
Ja klar, lies doch nochmal, was ich zu CHAR geschrieben habe!
Das Gleiche gilt natürlich auch für VARCHAR.
Wenn Du also NVARCHAR in Deiner SP verwendest, sollte es klappen.

Gruß,
Martin

Hallo Martin,

egal ob ich nvarchar(20) oder varchar(20) character set utf8 schreibe, die griechischen Zeichen werden immer in Fragezeichen (0x3F) umewandelt.

Die Prozedur (in MySQL):
DELIMITER $$
DROP PROCEDURE IF EXISTS zproc_char $$
CREATE DEFINER=root@localhost PROCEDURE zproc_char(

c nvarchar(20) character set greek,

c varchar(20) character set utf8,

c nvarchar(20),

out result varchar(99))
BEGIN

update mytable set lenfirst=length©,asciifirst=ascii©,text_de=c,text_el=c;

set result=„1“;
END $$
DELIMITER $$

die Länge des ersten Zeichens ist immer 1, außer ich übertrage ein „ü“, dann ist sie 2 und das erste Ascii Zeichen ist dann 0xC3.

Giobt es vielleicht irgendetwas beim Aufbau der Verbindug einzustellen?

Gruß Franz

Hi,
evtl übergibst du den String falsch.
Lg Knerd

Hi,

der Aufruf der SQL-Prozedur aus VB.NET:

dim myDBFactory = DatabaseFactory.CreateDatabase(„Service_Dflt“)
dim myConnect = wmDBFactory.CreateConnection()
myConnect.Open()
myCommand = myConnect.CreateCommand
dim myTransaction = myConnect.BeginTransaction
myCommand.Transaction = myTransaction
myCommand = myDBFactory.GetStoredProcCommand(„myProc“)
myCommand.CommandType = CommandType.StoredProcedure

myDBFactory.AddInParameter(myCommand, „myParamName“, DbType.String, „αβγ“)

myDBFactory.AddOutParameter(myCommand, „result“, DbType.String, 999)
myCommand.Connection = myConnect
Using myConnect
myCommand.ExecuteScalar()
myTransaction.Commit()
myConnect.Close()
myConnect.Dispose()
End Using
dim result = myCommand.Parameters.Item(myCommand.Parameters.Count - 1).Value

Ich bin mir nicht sicher, ob ich alles richtig zusammenkopiert habe, aber normalerweise funktioniert das. Muss hier irgendetwas noch gesetzt werden, um griechische Zeichen auch richtig zu übertragen?

Gruß, Franz

Hi,
du musst die Zeichen als Unicodezeichen übergeben. Das geht über „\u4
65“.
Lg Knerd

Wo gebe ich \u4 65 an?
Hi Knerd,

muss das innerhalb des zu übergebenden Strings stehen? \u4 bedeutet utf32, nehme ich an, und 65 ist das a oder Alpha.

Wie weiß ich denn in Visual Basic, welche Zeichen die Datenbank nicht versteht?

Gruß Franz

Hi,
ja das musst du im String angeben. \u steht für Unicode. Da tippst du dann eine Zahl ein. Genauso wie Alt+[Zahlencombi].

Lg Knerd

Hallo!

Das ganze Rumgewurstel mit den Unicode-Escapesequenzen ist unnötig, da .NET ohnehin mit Unicode arbeitet. Das Ergebnis bleibt gleich, egal, ob man ‚α‘ oder ‚\u465‘ schreibt.

Gruß,
Martin

Hallo nochmal!

Jemand hat gemeint, man müsse „&useUnicode=true&characterEncoding=UTF-8“ an den Connectionstring anhängen, um Unicodeunterstützung für die Verbindung zu bekommen.

Nach allem, was ich zu MySql gelesen habe, scheint die Unicode-Unterstützung zudem sehr von der Version abzuhängen. Welche DB-Server Version und welche Treiber verwendest Du? Es können wohl nicht alle Treiber Unicode, egal, was Du im Connectionstring angibst.

Ansonsten ist wohl die MySQL Entwicklerdoku zum Thema die sinnvollste Informationsquelle zum Thema: http://dev.mysql.com/doc/refman/5.0/en/connector-j-r…

Hast Du da mal nachgelesen?

Gruß,
Martin

Hi Martin,

„&useUnicode=true&characterEncoding=UTF-8“ an den
Connectionstring anhängen, um Unicodeunterstützung für die
Verbindung zu bekommen.

Das denke ich auch. Irgend so eine Einstellung für die Connection wird wohl notwendig sein. Die beiden oben erwähnten habe ich ausprobiert, es kommt aber die Meldung „Keyword not supported“, bei jedem der beiden.

Gruß, Franz

Was sagt denn die Entwicklerdoku zur Version Deiner MySQL-Datenbank?

Da Du immer noch nicht geschrieben hast, um welche Version es sich handelt und es - wie geschrieben - ziemliche Unterschiede bzgl. Unicode-Tauglichkeit gibt, sind die meisten Ratschläge ein Schuss ins Blaue…

Gruß,
Martin

Mein MySQL Query Browser sagt: Version 1.2.17, Copyright 2005-2008, MySQL AB 2009 Sun Microsystems Inc.

VB.NET: Microsoft Visual Studio 2008 Professional Edition.

Was gäbe es noch zu prüfen?

Gruß,
Franz

Hallo nochmal!

Die Version des Query Browsers scheint keinen Bezug zur Datenbank-Engine zu haben. Momentan ist MySql bei 5.5(.25) angelangt.
Da der Copyright-Vermerk aber auch schon recht alt ist, würde ich vorschlagen, mal eine aktuelle Version zu installieren und es nochmal zu probieren.
Insbesondere auch einen aktuellen .NET Connector verwenden (http://www.mysql.de/downloads/connector/net).

Gruß,
Martin