DBI MySQL INSERT und ASCII zeichen !?
MrSpoocy
- perl
Hi,
hab nin kleines Perl script und das soll eigendlich per DBI daten in die datenbank schreiben. Macht es auch jedoch hat es irgendwie probleme mit ASCII zeichen. z.b. 255. Füge ich es per script ein steht in der DB was ganz anderes. Die DB ist richtig eingestellt, wenn ich per mysql console den gleichen insert mach stimmt alles. Was mache ich falsch woran könnte es liegen ?
mfg Spoocy
Hallo,
was meinst du mit "die Datenbank ist richtig eingestellt"?
Vielleicht ist ja das Perl-Script nicht "richtig eingestellt". Kenne mich mit Perl wenig aus, aber allgemein kann ich sagen: 255 ist kein ASCII Zeichen (Der ASCII Zeichensatz umfasst nur 7 Bit, also 0 bis 127). Wahrscheinlich verwendet also das Script eine andere Kodierung als die Datenbank. Die Konsole dagegen wird dann wohl die gleiche Kodierung verwenden wie die Datenbank
Liebe Grüße
mbr
Hallo,
was meinst du mit "die Datenbank ist richtig eingestellt"?
Vielleicht ist ja das Perl-Script nicht "richtig eingestellt". Kenne mich mit Perl wenig aus, aber allgemein kann ich sagen: 255 ist kein ASCII Zeichen (Der ASCII Zeichensatz umfasst nur 7 Bit, also 0 bis 127). Wahrscheinlich verwendet also das Script eine andere Kodierung als die Datenbank. Die Konsole dagegen wird dann wohl die gleiche Kodierung verwenden wie die DatenbankLiebe Grüße
mbr
Also ich kenn mich leider auch nicht so gut mit aus. Aber zum test habe ich in das script folgendes geschrieben:
my $msg = "- † - -";
open FILE, ">> test.txt";
print FILE "-> ".$msg."\n";
close FILE;
in dem file wird das zeichen (†) richtig dargestellt. Wenn ich genau die $msg variable nun in die DB einfügen will kommen halt die komischen zeichen.
my $DB_NAME = "db";
my $DB_HOST = '';
my $DB_PORT = '';
my $DB_USER = "root";
my $DB_PASSWD = "root";
my $DB_DSN = "DBI:mysql:database=$DB_NAME";
my $dbh;
$dbh = DBI->connect($DB_DSN, $DB_USER, $DB_PASSWD);
if (!$dbh) {
message "Fehler bei Datenbankverbindung: $_!";
} else {
my $sth = $dbh->do("INSERT INTO f_test (name) VALUES ('$msg')");
}
mfg Spoocy
Hell-O!
Die DB ist richtig eingestellt
Welcher Charset ist denn eingestellt (siehe Specifying Character Sets and Collations)? Wird dies durchgängig von der Dateneingabe über die Datenverarbeitung im Script bis hin zur Datenbankverbindung einheitlich beibehalten? Schau dir auch mal Connection Character Sets and Collations an.
Siechfred
Hell-O!
Die DB ist richtig eingestellt
Welcher Charset ist denn eingestellt (siehe Specifying Character Sets and Collations)? Wird dies durchgängig von der Dateneingabe über die Datenverarbeitung im Script bis hin zur Datenbankverbindung einheitlich beibehalten? Schau dir auch mal Connection Character Sets and Collations an.
Siechfred
Danke für die schnelle antwort. Das problem is das es sich um eine sehr eigenartige form von perl handelt. Kein Aktive perl. Ein einzige exe die aus modulen compeliert wurde.
Mit DB einstellung meine ich die in der mysql.ini (default-character-set=utf8). Kann es denn sein das mein kumpel der mir die exe compeliert hat irgend ein modul vergessen hat ? Oder etwas falsch compeliert hat ? Man sollte aber denken das das insert etc ja geht. Also DBI is zumindest irgendwie drin :)
mfg Spoocy
Das problem is das es sich um eine sehr eigenartige form von perl handelt. Kein Aktive perl. Ein einzige exe die aus modulen compeliert wurde.
Das klingt zwar ungewöhnlich, aber sollte dein Problem nicht beeinflussen. Offenbar funktioniert der Zugriff auf die DB via DBI.pm ja, nur eben nicht so, wie du es gerne hättest.
Du musst also untersuchen:
Dies muss einheitlich sein, ist es das nicht, hast du zumindest eine Fehlerquelle.
Siechfred
Das problem is das es sich um eine sehr eigenartige form von perl handelt. Kein Aktive perl. Ein einzige exe die aus modulen compeliert wurde.
Das klingt zwar ungewöhnlich, aber sollte dein Problem nicht beeinflussen. Offenbar funktioniert der Zugriff auf die DB via DBI.pm ja, nur eben nicht so, wie du es gerne hättest.
Du musst also untersuchen:
- Charset der Daten, die im Script ankommen
- Charset der Daten, die das Script verlassen
- Charset der Datenbankverbindung
- Charset der Datenbank inkl. Tabelle und deren Spalten
Dies muss einheitlich sein, ist es das nicht, hast du zumindest eine Fehlerquelle.
Siechfred
wenn du mir sagst wie ich das prüfe :) ?
mfg Spoocy
Das problem is das es sich um eine sehr eigenartige form von perl handelt. Kein Aktive perl. Ein einzige exe die aus modulen compeliert wurde.
Das klingt zwar ungewöhnlich, aber sollte dein Problem nicht beeinflussen. Offenbar funktioniert der Zugriff auf die DB via DBI.pm ja, nur eben nicht so, wie du es gerne hättest.
Du musst also untersuchen:
- Charset der Daten, die im Script ankommen
- Charset der Daten, die das Script verlassen
- Charset der Datenbankverbindung
- Charset der Datenbank inkl. Tabelle und deren Spalten
Dies muss einheitlich sein, ist es das nicht, hast du zumindest eine Fehlerquelle.
Siechfred
Also mit hilfe von WPE Pro hab ich die netzwerkübertragung von der exe überwacht und dort sendet die exe an meinen localen mysql server die richtigen daten, im HEX steht 86 = † und A0 = ASCII255.
Was könnte nun der fehler sein ?
MySQl hab ich die 5.0.20 unter Windows Xp installiert.
Hast du vieleicht mal nin db server wo ich die daten mal testweise senden kann ? nein webhoster läst leider keine externe verbindung zu :(
im HEX steht 86 = †
Dann ist es ANSI. Eine gute Erklärung zu den Besonderheiten gibts u.a. hier. Diese Seite beschreibt die Umwandlung mit Hilfe von binmode und verweist auf einen recht ausführlichen Artikel im Linux Magazin.
Vielleicht hilft dir das weiter.
Siechfred
im HEX steht 86 = †
Dann ist es ANSI. Eine gute Erklärung zu den Besonderheiten gibts u.a. hier. Diese Seite beschreibt die Umwandlung mit Hilfe von binmode und verweist auf einen recht ausführlichen Artikel im Linux Magazin.
Vielleicht hilft dir das weiter.
Siechfred
Also ich hatte jetzt testweise mit dem gleichen script mal auf die DB eines kumpels werte einfügen lassen. Drot geht das script. Also muß es doch eine einstellung bei meinem MySQL sein. Hab WindowsXP und MySQL 5.0.20.
In der ini steht ganz oben
[client]
default-character-set=utf8
port=3306
[mysql]
default-character-set=utf8
mfg Spoocy