php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.10.2009, 15:46  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard Umlaute werden nicht in Datenbank geschrieben?!

Hallo Leuts,

ich hab mal wieder ein Problemchen was ich einfach nicht gelöst bekomme

Und zwar geht es wie der Titel schon sagt um "Ä,Ö,§,°"

Zur Erklärung. Ich lese Daten aus einer Datenbank aus und speichere die dann in eine andere DB wieder ab. Jetzt ist es aber so, das die Quelldatenbank latin_swedish_ci ist und die Zieldatanbank utf8_unicode_ci.
Also ich lese die Daten aus der Datenbank aus, schaue ob es den Datensatz
schon gibt und wenn nicht, wird er reingeschrieben.
Hier mal der Code:
PHP-Code:
$sql="SELECT terminart, name, dauer, farbe, neu FROM ".$DB['db_alt'].".".$row[0]." ORDER BY terminart";
$ergs=mysql_query($sql,$linkID);
if(
$ergs AND mysql_num_rows($ergs)>0){
  while(
$result_altmysql_fetch_array($ergs)){
      if(
$result_alt['name']=="frei"$result_alt['terminart']='fr';
        
$sql="SELECT terminart FROM ".$DB['db_neu'].".".$row[0]." WHERE terminart= '".mysql_real_escape_string($result_alt['terminart'])."'";
        
$erg2=mysql_query($sql);        
        if(!(
$erg2 AND mysql_num_rows($erg2)>0)){
          
$sql="INSERT INTO ".$DB['db_neu'].".".$row[0]." (".$liste.") VALUES
                                                         ('"
.mysql_real_escape_string($result_alt['terminart'])."',
                  '"
.$result_alt['name']."', 
                  '"
.$result_alt['dauer']."', 
                  '"
.$result_alt['farbe']."', 
                  '"
.$result_alt['neu']."')";
           
$import=mysql_query($sql);
         } 
      } 
  } 
Jetzt werden zwar die Zeichen "§ und ° richtig eingetragen, jedoch Ä und Ö
fehlen. Wenn ich jetzt bei den Abfragen ein utf8_encode() einfüge, werden
zwar Ä und Ö mit reingeschrieben, aber so:

Code:
Ä=>Ä
Ö=>Ö
§=>§
°=>°
Ich bin mir ziemlich sicher das liegt am Zeichensatz. Aber ich finde einfach keine Lösung zu dem Problem.
Zumal im Feld 'name' auch Umlaute drin stehen wie z.B. "Ü-Stätte". Diese
werden aber richtig kopiert. Steht also richtig drin

Mfg
pfump ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.10.2009, 15:50  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Sieht mir auch nach Zeichensatz-Problem aus. Schon den Zeichensatz der Datenbank(verbindung) umgestellt?

PHP-Code:
<?php
  
// UTF-8
  
mysql_query("SET NAMES 'utf8'") OR print(mysql_error());
  
mysql_query("SET CHARACTER SET 'utf8'") OR print(mysql_error());
?>
Jetzt test ich meistens aber auch hin und her, steh total auf Kriegsfuß mit Zeichensätzen, weshalb ich auch alles immer UTF-8 und dann "meistens" alles funktioniert
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Alt 19.10.2009, 16:36  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard

Das hat leider auch nicht geholfen.
Jetzt siehts so aus:
Code:
Ä=>steht nicht drin
Ö=>steht nicht drin
§=>§
°=>°
Laß ich das utf8_encode() weg, stehen § und ° richtig drin.
Aber beim Ä und beim Ö wird die if-Anweisung
PHP-Code:
if(!($erg2 AND mysql_num_rows($erg2)>0)) 
scheinbar nicht ausgeführt. Ich hab vor der Bedingung und nach der Bedingung ein
PHP-Code:
echo $sql
eingefügt und das sieht dann so aus:

PHP-Code:
...
SELECT terminart FROM testdb.tb_terminart WHERE terminart'z'
INSERT INTO testdb.tb_terminart (terminartname dauer farbe neu VALUES                                                          ('z',                                                           'Zeitkarte',                                                              '00:30:00',                                                              '#FFFF00',                                                              'j')
SELECT terminart FROM testdb.tb_terminart WHERE terminart'Ä'
SELECT terminart FROM testdb.tb_terminart WHERE terminart'Ö'
SELECT terminart FROM testdb.tb_terminart WHERE terminart'_'
INSERT INTO testdb.tb_terminart (terminartname dauer farbe neu VALUES                                                          ('_',                                                           'Klausurtagung',                                                              '00:00:00',                                                              '',                                                              'j')
... 
pfump ist offline   Mit Zitat antworten
Alt 19.10.2009, 16:40  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Jetzt ist es aber so, das die Quelldatenbank latin_swedish_ci ist und die Zieldatanbank utf8_unicode_ci.
Naja, dann hast Du doch das Problem. Versuchs mal mit zwei Verbindungen, benutze PsychoEagles Vorschläge mit den jeweiligen Zeichensätzen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 19.10.2009, 16:44  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard

Ich weiß leider nicht genau was du jetzt meinst
pfump ist offline   Mit Zitat antworten
Alt 19.10.2009, 17:53  
Erfahrener Benutzer
 
Benutzerbild von Screeze
 
Registriert seit: 04.01.2009
Beiträge: 844
PHP-Kenntnisse:
Fortgeschritten
Screeze wird schon bald berühmt werden
Standard

du brauchst 2 versch. datenbankverbindungen.
Die eine bezieht sich auf die latin, und die andere auf die utf8 datenbank.
dementsprechen konfigurierst du die beiden verbindungen, wie oben schon vorgeschlagen.

beim übergeben von werten benutzt du noch eine passende funktion zum codieren, und fertig.
google hilft beim rest.
__________________
Develovision Blog
Screeze ist offline   Mit Zitat antworten
Alt 19.10.2009, 18:03  
there's only one psycho
 
Benutzerbild von PsychoEagle
 
Registriert seit: 21.08.2007
Beiträge: 1.283
PHP-Kenntnisse:
Anfänger
PsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer MenschPsychoEagle ist ein sehr geschätzer Mensch
PsychoEagle eine Nachricht über ICQ schicken PsychoEagle eine Nachricht über Skype™ schicken
Standard

Du speicherst dir ja deine Connections in Variablen ab:

PHP-Code:
<?php
  $linkID 
mysql_connect(...);
?>
Bzw bei dir seh ich jetzt nur eine, die andere nimmst du wohl als Standard:

PHP-Code:
<?php
  $linkID 
mysql_connect('die erste');
  
mysql_connect('die zweite als Standard');
 
?>
Nun musst du auch bei beiden den Übertragungs bzw. Datenbank-Zeichensatz angeben:

PHP-Code:
<?php
  
// Source Database
  
$link_src mysql_connect(...); // anstatt $linkID
  
mysql_query("SET NAMES 'utf8'",$link_src) OR print(mysql_error());
  
mysql_query("SET CHARACTER SET 'utf8'",$link_src) OR print(mysql_error());

  
// Destination Database
  
$link_dest mysql_connect(...); // anstatt den Standard
  
mysql_query("SET NAMES 'latin1'",$link_dest) OR print(mysql_error());
  
mysql_query("SET CHARACTER SET 'latin1'",$link_dest) OR print(mysql_error());
?>
Und überall dann die jeweilige connection mitgeben (also als Parameter):

PHP-Code:
<?php
  mysql_query
($sql,$link_dest);
?>
Denke so sollte das irgendwie dann funktionieren. Ggf. noch mit utf8_encode arbeiten, bin mir da jetzt gar nicht so sicher. Am Zeichensatz des Scriptes sollte es denke ich mal nicht liegen.

Just for fun einfach noch sowas einbauen:

PHP-Code:
<?php
  $charset 
'iso-8859-1';  // utf-8
  
header('Accept-Charset: '$charset);
  
header('Content-Type: text/html; charset='$charset);
?>
__________________
"Weaseling out of things is important to learn. It's what separates us from the animals ... except the weasel." (Homer J. Simpson)
PsychoEagle ist offline   Mit Zitat antworten
Alt 19.10.2009, 19:22  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

@psy Ich habe irgendwann mal die Erfahrung gemacht, dass es besser ist, SET NAMES wegzulassen und nur SET CHARACTER SET zu nutzen. Warum weiß ich ehrlich gesagt nicht so genau.

@pfump Wenn ich dich recht verstehe, liest du aus einer Latin1-DB aus und schreibst das in eine Unicode-DB?
Dann wird dir auch das Ändern des Zeichensatzes nicht helfen, da dieser nur festlegt, wie die Zeichen angezeigt werden, nicht um welche es sich handelt. Ein Zeichen, das aus einem Byte besteht, wird immer aus einem Byte bestehen, ob du es nun mit ISO- oder Unicodesätzen anzeigst. Es wird kein zwei Byte großes Unicodesonderzeichen daraus. Du musst die Daten vorher also umwandeln. Einfach rüberkopieren bringt nichts.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems

Geändert von Manko10 (19.10.2009 um 19:27 Uhr).
Manko10 ist offline   Mit Zitat antworten
Alt 19.10.2009, 19:31  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Einfach rüberkopieren bringt nichts.
Das was Du meinst, hat er ja gerade festgestellt. Generell bringt ein Kopieren nach UTF-8 schon etwas, nämlich, dass man später weitaus mehr Sonderzeichen benutzen kann.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 19.10.2009, 19:34  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard

Aha. Und wie wandle ich die um?
Meinst du etwa die Lösung mit str_replace()?
Ich hab gelesen das wäre keine gute Lösung für solch ein Problem...
pfump ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe: datenbank mappen und kopieren M*I*B Datenbanken 29 15.02.2012 21:55
Datenbank austauschbar machen durch Trennung von konkreter Implementierung Asipak PHP-Fortgeschrittene 10 04.09.2009 00:11
Probleme Umlaute bei UTF-8 user0815 PHP Tipps 2009 27 11.08.2009 12:55
[Erledigt] Im- / Export einer MySQL Datenbank amaier161 Datenbanken 5 19.07.2009 00:42
Umlaute in MySQL Datenbank singu Datenbanken 23 05.06.2009 22:03
MySQL Konsole und Umlaute unter Windows [LÖSUNG] f4ckm5 Datenbanken 8 30.03.2009 22:10
[Erledigt] Welche Koalation um Umlaute nicht zu verlieren? Stephan_87 Datenbanken 3 15.12.2008 15:05
Umlaute und str_replace MatzeMuc86 PHP Tipps 2008 20 22.10.2008 20:41
Umlaute und Ajax themonk JavaScript, Ajax und mehr 5 12.10.2008 18:30
Umlaute in Datenbank zerschossen. Wie reparieren? MatzeMuc86 Datenbanken 1 14.09.2008 17:48
Umlaute in Datenbank MYSQL schreiben sebastian1986 Datenbanken 3 09.09.2008 16:01
Umlaute in Datenbank Eldra PHP Tipps 2008 3 14.05.2008 07:11
[Erledigt] Keine Umlaute beim MediaWiki im Internet Explorer PHP Tipps 2006 1 15.02.2006 18:50
HTML-Entities aus Datenbank auch als HTML-Entity darstellen PHP Tipps 2007 7 18.11.2005 13:31
[Erledigt] Umlaute (Ä,Ö,Ü) aus Datenbank auslesen Datenbanken 10 30.08.2005 21:02

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/datenbanken/60222-umlaute-werden-nicht-datenbank-geschrieben.html, umlaute werden nicht in datenbank geschrieben, umlaute werden nicht richtig in db geschrieben, umlaute datenbank, umlaute werden nicht in die datenbank geschrieben, umlaute in datenbank, php umlauter werden nicht in utf 8 datenbank insert, umlaute werden nicht geschrieben, utf-8 datenbank kopie umlaute falsch, insert sonderzeichen into database, umlaute werden falsch in datenbank geschrieben, ö wird nicht in datenbank geschriebn, sql import feldname nicht utf8 ü, umlaute werden nicht in db geschrieben, umlaute in datenbank schreiben, umlaute werden nicht in datenbank eingetragen, latin_swedish_ci umlaute, umlaute werden nicht in db eingetragen, sql sonderzeichen wird nicht, php insert into db umlaute

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:51 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum