Thread für in der MySQL-Datenbank ... (11 answers)
Opened by rtp_de at 2013-11-26 15:48

rtp_de
 2013-11-26 15:48
#172220 #172220
User since
2013-08-17
8 Artikel
BenutzerIn
[default_avatar]
Hallo miteinander,

"Ich kann lesen." steht auf einem T-Shirt, das ich mal von einer Buchmesse mit nach Hause gebracht habe. Und ich habe die letzten Tage wirklich viel Ergebnisseiten von Google und Einträge in diesem Forum hier zu diesem Thema gelesen. Das alles hat mich auch schlauer gemacht. Einzig: Eine Lösung habe ich noch nicht. Das tötet mir echt den Nerv - und dabei kam noch nicht einmal "Last Christmas" im Radio!! (Radio zerstören - Radio vergraben - Loch ausbetonieren - Mahnmal aufstellen.)

Worum geht es?

Zunächst lese ich mit LWP eine XML-Datei ein, die UTF8-codiert ist. Die Codierung belasse ich beim Einlesen auch so, weil es sich um einen RSS-Feed handelt. (Als ich testweise die Codierung bereits beim Einlesen geändert habe, hat XML:RSS beim Parsen gestreikt.)

Anschließend verarbeitet eine Schleife den Feed. An eine Stelle wende ich für z. B. "title" aus dem Feed $_=Encode::encode("ISO-8859-1",$_); an.

Wenn ich anschließend das Ganze in eine neue Text-Datei schreibe, erfreut sich mein Herz an schönen Umlauten. Wenn ich das Ganze aber mit DBI in eine MySQL-Datenbank schiebe, verätzen mit dir ü dieser Welt die Hornhaut.

Zur Erklärung: Ich mache solche versauten Sachen sonst nicht. Normalerweise schreibe ich CGI-Skripte, die Benutzereingaben im Browser in Tabellen auf einem MySQL-Server speichern. Ohne viel darüber nachzudenken habe ich als Kollation für MySQL immer latin1_german1_ci ausgewählt und alle Umlaute blieben Umlaute und ich hatte über Jahre damit nie Probleme.

Das Problem - argh - tritt beim oben beschriebenen Fall erstmals auf. Ich habe auch schon versucht, den ganzen Prozess von vorne bis hinten einheitlich auf UTF-8 auszurichten, d. h. z. B.
- Skriptdateien in dieser Codierung speichern;
- use utf8;
- $dbh->{'mysql_enable_utf8'} = 1;
- $dbh->do("SET NAMES utf8");
- binmode(STDOUT, ":utf8");
usw.
Es war aber immer noch nicht so, dass in der MySQL-Tabelle einfach nur der Umlaut stand. (Habe ich den nervtötenden Aspekt bei diesem Thema schon erwähnt?)

Kurzum: Wenn ich den String in eine Datei schreibe, passt es. Wenn ich ihn in eine MySQL-Tabelle schreibe, passt es nicht. Wie kann ich einen UTF-8-Sonderzeichen in einen Umlaut (z. B. nach ISO-8859-1 oder etwas Darüberliegendes) umwandeln und in eine MySQL-DB schreiben?

Wer die Antwort weiss rettet meiner Familie und mir die Adventszeit und hat echt was gut...

PS: Ich ergänze dieses Codebeispiel noch hier bei der Threaderöffnung:
Code (perl): (dl )
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
#!/usr/bin/perl 

use DBI;
use LWP::UserAgent;
use XML::RSS;
use Encode;
use warnings "all";

# Datenbankverbindung aufbauen
my $dbh=DBI->connect('dbi:mysql:***','***','***');

# Datei-Fetching mit LWP
my $url = "http://www.dieter-broers.de/blog.xml";       
my $ua = LWP::UserAgent->new();
$ua->agent('Opera');
my $response = $ua->get($url);
my $ticker=$response->content();

# Irgendetwas aus dem RSS extrahieren und das in die Datenbank schreiben
my $rss = XML::RSS->new();
$rss->parse($ticker);
foreach $item (@{$rss->{'items'}}){
        my $title = $item->{'title'};
        my $sth = "INSERT INTO `meinetabelle` (`titel`) VALUES ('$title');";
        my $query=$dbh->prepare($sth); 
        $query->execute;
        }

# Datenbankverbindung trennen
$dbh->disconnect;


modedit Editiert von GwenDragon: Titel gekürzt
Last edited: 2013-11-27 11:05:57 +0100 (CET)

View full thread für in der MySQL-Datenbank ...