php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 26-06-2007, 20:05
steffi123
 Newbie
Links : Onlinestatus : steffi123 ist offline
Registriert seit: Jun 2007
Beiträge: 3
steffi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Bin Dabei meine Webseite/Mysql auf UTF-8 umzustellen und brauche hilfe bei einem Prob

Hallo, ich bin neu hier und möchte mich gleich mit einem großen Problem an euch wenden, ich hoffe das macht keinen schlechten Eindruck

Ich habe vor kurzem beschlossen meine Webseite von ISO-8859-1 Zeichenkodierung auf UTF-8 umzustellen, und ebenso auch meine Mysql Datenbank aus der die Webseite einige Inhalte dynamisch erstellt (die Datenbank besteht aus ein paar Tabellen mit der Kollation Latin1_general_ci und diese Daten habe ich allesamt über Eingabeformulare auf meiner Webseite gefüllt d.h. sie kamen schon von der Webseite im ISO-8859-1 Format). Dabei bin ich nun auf ein paar Probleme gestoßen die ich mit meinem mangelnden Wissen nicht mal lokalisieren kann, ich habe aber ein Datenbankbackup und habe daher ein bisschen herrumexperimentiert. Aber nun erstmal zu meinem konkreten Problem:

Mein erster Schritt in der Umstellung der Webseite war: die einzelnen Webseiten als UTF-8 abzuspeichern (ohne BOM, wegen SESSION/Header Problemen). Desweiteren habe ich auch in den Meta-Tags den neuen charset eingestellt damit die Seite auch richtig angezeigt wird (und der Browser erkennt auch UTF-8 als Charset bzw. benutzt es). Zuerst ist mir dann natürlich aufgefallen das die Webseite an den Stellen an welchen Textinhalte aus der Mysql-Datenbank angezeigt wurden teilweise Fehler aufwies, also im speziellen wurden deutsche Umlaute durch einfache "?" ersetzt (jedes Zeichen das nicht dargestellt werden konnte wurde durch so ein Fragezeichen ersetzt) auch im Quellcode, eine testweise, temporäre, manuelle Umstellung der Zeichenkonvertierung im Browser (ich benutzte FireFox, da geht das über "Ansicht") auf ISO-8859-1 sorgte wieder für eine korrekte Darstellung dieser "?". Ich vermutete das diese fehlerhafte Darstellung darauf zurückzuführen ist das die Datenbank die Inhalte nicht um UTF-8 Format enthält also dachte ich mir das es wohl das Sinnvollste wäre die Datenbank bzw. die Inhalte zu konvertieren, aber bevor ich dies versuchte habe, habe ich zum Testen nocheinmal versucht einen dieser Textinhalte aus der Datenbank über eben so ein Formular über welches ich es ursprünglich in die Datenbank gebracht habe, zu editieren, ich habe also den Text bearbeitet und siehe da, scheinbar wurde dieser bearbeitete String dann im UTF-8 Format abgespeichert (vermutlich weil die Seite ja jetzt eine UTF-8 Datei war). Alle anderen Strings konnten zwar noch immer nicht vernüpftig dargestellt werden aber dieser Eine war ok, nur dachte ich mir das es wenig bringt jetzt jeden Inhalt auf diese Weise zu konvertieren da es ewig dauern würde (außerdem habe die Tabellen ja noch die Kollation Latin1_general_ci und ich will ja utf8_unicode_ci, ich verstehe zwar nicht wieso es auch so klappt aber ich will lieber sicher gehen).
Deshalb habe ich eine der Datenbank-Tabellen mit phpMyAdmin exportiert (in eine Reihe SQL Anweisungen: ein Table Create und diverse Inserts) habe dann diese eine Tabelle gelöscht und neu angelegt und zwar diesmal so das ich alle Kollationen auf utf8_unicode_ci gestellt habe, dann habe ich mir die exportieren Inserts vorgenommen und in einer UTF-8 Datei gespeichert (um sie zu konvertieren). Diese Datei habe ich dann über die Importfunktion von phpMyAdmin benutzt um die Tabelle wieder zu füllen (habe auch angegeben das die Datei UTF-8 ist). So nun müsste diese Tabelle doch eigentlich UTF-8 enthalten oder nicht?
Jedenfalls brachte dies Überhaupt nichts, die Inhalte wurden trotzdem genauso "?"-behaftet angezeigt wie vorher.

So dieses Problem hat erstmal dafür gesorgt das ich mich 2 Tage lange Abends in den Schlaf geweint habe, bis ich vor kurzem von diesem Mysql Befehl erfahren habe: SET NAMES 'utf-8'
wenn man dieses vor der Kommunikation mit der Datenbank aufruft dann sollte die gesammte Kommunikation in UTF-8 ablaufen, also die Datenbank erwartet vom Client UTF-8 und sendet selbst auch so. Und dies brachte in der Tat einen ersten Erfolg (ich brachte so einen Query nämlich im Konstruktor meiner Mysql Klasse unter) nämlich wurden auf einmal sämtliche Datenbankinhalte auf der UTF-8 Webseite völlig Fehlerfrei angezeigt, sowohl die ganzen alten Tabellen als auch diese eine neue die ich schon wie oben beschrieben ins UTF-8 konvertiert hatte (obwohl ich mir nicht sicher bin ob meine Methode überhaupt für eine Konvertierung gesorgt hat, ich weiß ja nicht wie ich das Nachprüfen kann). Nur einen großen Haken hatte die Sache: sämtliche neuen oder bearbeiteten Inhalte (über die Formulare auf der Webseite) werden nun nicht vernüpftig in der Datenbank gespeichert (egal ob sie in der neuen konvertieren Tabelle oder in den alten abgelegt werden), die deutschen Umlaute werden, in der Tabelle gespeichert und zwar so das die Umlaute und einige Sonderzeichen durch ein bis zu 3 Zeichen langes cryptisches Etwas ersetzt werden, sowohl in phpMyAdmin als auch auf der Webseite, wenn die Daten wieder ausgelesen werden, sieht es zumindest gleich cryptisch aus. Nur ist es diesmal so, das ein Manuelles wechseln der Zeichenkodierung im Browser alles nur schlimmer machte, also keine andere Kodierung sorgte auch nur für eine bessere Darstellung.

Wie man sieht hat SET NAMES 'utf-8' das Problem jetzt umgekehrt: vorher wurden die alten Daten falsch angezeigt, egal ob konvertiert oder nicht, dafür aber die neuen korrekt und jetzt werden die alten Daten, egal ob konvertiert oder nicht, korrekt angezeigt, aber die neuen werden noch kryptischer.

So das ist mein Problem, ich hoffe das ich hier einen Profi finde der mir sagen kann wo das Problem liegen könnte, und mir nebenbei vieleicht noch sagt ob mein beschriebener Umkodierungsversucht den ich oben für eine Tabelle testweise durchgeführt habe, korrekt war oder ob er nichts geändert hat.
Wenn mir jemand helfen kann, dann wäre ich unendlich glücklich da meine Webseite nun schon einige Zeit lang offline ist und ich kurz vor dem Nervenzusammenbruch stehe.
Mit Zitat antworten
  #2 (permalink)  
Alt 26-06-2007, 20:12
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Keine Ahnung, das klingt als würdest du den Zeichensatz irgendwo schrotten...

Wenn der Browser die Website als UTF8 anzeigt und "set names" mit utf8 beim Verbinden mit der DB aufgerufen wird, ist alles okay.
Alles weitere machst du ggf. selbst kaputt, da hilft dann nur Eingrenzen des Problems.
Mit Zitat antworten
  #3 (permalink)  
Alt 26-06-2007, 20:35
steffi123
 Newbie
Links : Onlinestatus : steffi123 ist offline
Registriert seit: Jun 2007
Beiträge: 3
steffi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hmm, also mit SET NAMES werden ja die alten Datenbestände korrekt angezeigt, obwohl korrekt vielleicht das falsche Wort ist, denn die alten Daten wurden ja nicht als UTF-8 abgelegt, oder bewirkt SETNAMES auch das die Datenbank die Daten vorher umkodiert damit ja in jedemfall UTF-8 sind?
Das Problem ist ja das mit SET NAMES die Neuen Daten nicht mehr vernüpftig gespeichert werden, das kann ja meinem Verständnis nach nur daran liegen das sie entweder vom Browser nicht als UTF-8 gesendet werden, oder nicht so gespeichert werden (denn phpMyAdmin zeigt sie genau so kryptisch an) ich habe sogar mal in den Formularen das accept-charset auf UTF-8 gestellt zur sicherheit, hat aber nichts geändert.
Was mich nur wundert ist das die Datenbank die Daten nicht als UTF-8 abesendet wenn SET NAMES nicht benutzt wird, auch bei der Manuell umkonvertieren Tabelle nicht, wohl aber bei den Neuhinzugefügen Daten. Das ist alles sehr verwirrend. Wie kann ich denn das Problem näher eingrenzen?
Wie gesagt habe ich ein Backup der Datenbank und bin bereit jeden noch zu absurden Vorschlag mal irgenteine belibige Änderung vorzunehmen auszuführen, hauptsache ich bekomme das Problem irgentwann gelöst.
Mit Zitat antworten
  #4 (permalink)  
Alt 26-06-2007, 20:42
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

1. Verabschiede dich von der Idee, dass Kollation irgendwas mit Zeichensatz zutun hat - Pustekuchen. Kollation = Sortierung = vollkommen irrelevant
2. Der MySQL-Server speichert die Daten von vornherein als UTF8, seit Version 4.2.* glaube ich.
3. Nur der Zeichensatz der Verbindung bestimmt in welchem Zeichensatz die Daten zurückgeliefert werden.
Der Standard ist latin1/iso-8859-1, da das nur mit Rekompilation der Libs zu ändern ist, war das wohl auch bei dir der Standard.
Ändert kann man das dynamisch per SET NAMES.
Problem: Wenn man SET NAMES 'utf8' verwendet, der Browser allerdings keine UTF8 Daten schickt, oder umgekehrt SET NAMES nicht verwendet, aber der Browser schickt schon utf8-Daten. Dann geht nämlich der Server von einem Zeichensatz aus in dem er die Daten bekommt, in dem diese Daten allerdings nicht kommen, demnach werden diese kaputt gespeichert und können auch nur noch kaputt ausgelesen werden.

Das erklärt nur alles nicht dein Problem, nämlich dass Einfügen funktioniert und Auslesen nicht...
Sind die Daten per PMA lesbar?
Wenn nein ist das Eintragen kaputt, wenn ja das Ausgeben.
Wenn also das Eintragen kaputt ist kontrolliere ob du irgendwelche Patterns (preg_match), oder sonstige String-Funktionen auf den String anwendest. Lass dir den Query ausgeben, den du an die DB sendest: In welcher Zeichenkodierung liegt der Query vor?
Sicher, dass SET NAMES korrekt erkannt wurde?
SHOW VARIABLES LIKE "charset%";
hilft
Zitat:
A SET NAMES 'x' statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
demnach müssen diese 3 Variablen nach dem SET NAMES-Query auf utf8 stehen, ansonsten ist der SET NAMES Query falsch oder fehlte ... debugging halt, muss du selbst mal gucken, da kann dir keiner helfen
Mit Zitat antworten
  #5 (permalink)  
Alt 26-06-2007, 22:59
steffi123
 Newbie
Links : Onlinestatus : steffi123 ist offline
Registriert seit: Jun 2007
Beiträge: 3
steffi123 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

vielen Dank ich habe da tatsächlich noch einen Mysql Klasse gefundenb in der ich das SET NAMES vergessen hatte, daran lags
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:05 Uhr.