[PHP/MYSQL] Probleme mit der Kollation

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

ich habe eine weitere Anwendung für's Web geschrieben, nachdem ich jetzt lange inaktiv war ... und promt ist da ein Fehler: Umlaute und Co werden nach dem Abspeichern in der DB nicht mehr richtig angezeigt. Und es wird höchste Zeit, dass ich mich mit folgendem beschäftige:

1.) Kollation (also der Zeichensatz) - was verwende ich da? Was ist allgemein sinnvoll? Muss ich das nach mysql_connect mit mysql_set_charset setzen?

2.) Welche Datenbankengine nehme ich am Besen, für
* eine kleine Datenbank (2 Tabellen mit max. 500 Einträgen instesamt) und
* eine große Datenbank (18 Tabellen mit 1.000.000 + Einträgen)?

Ich möchte nicht, dass Ihr mich falsch versteht: die Fakten kann ich im Web nachlesen, aber mir kommt es auf Eure Erfahrungen und Tipps an ...

CPU :(
 
Also ich hatte mal das selbe Problem, auch Änderungen am Charset (bei mir ascii_general_ci /außer bei Passwöter ascii_general_bin) haben nichts genützt, bis ich drauf gekommen bin, das ich die Eingaben mit htmlentities() maskieren muss. Dann hat es auf Anhieb geklappt.

Den einzigen Nachteil dieser Methode sehe ich darin, sollten die Daten einmal nicht über eine PHP/HTML Schnittstelle geladen werden, wird es etwas aufwendiger die Zeichen wieder zu entmaskieren.
 
Zuletzt bearbeitet:
Ich benutze immer latin1_german2_ci.

Stehen die Zeichen denn schon falsch in der DB oder tritt der Fehler erst bei der Ausgabe auf? Je nachdem muss man halt schon beim Einfügen in die DB aufpassen oder eben bei der Ausgabe.

Möglicherweise scheiterts im Moment auch nur am falschen Zeichensatz, den du in der Webseite im head-Tag angibst (bspw. UTF-8 oder ISO 8859-1):
HTML:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
Hey,

mit den "normalen" MyISAM Tabellen habe ich eigentlich gute Erfahrungen gemacht. Gerade wenn du viele Insert/Select Queries durchführst sind diese besonders schnell, auch wenn du dir die gesamten Einträge einer Tabelle ausgeben lassen willst sind die gut geeignet. Meiner Meinung nach immer noch die erste Wahl solange es nicht auf sichere Transaktionen, Rollbacks, etc. ankommt. Der Performancegewinn überwiegt mNn im reinen Webgebrauch einfach zu sehr.

Bei dem Problem mit den Sonderzeichen würde ich auch eher auf eine fehlende oder falsche Zeichensatzkodierung des HTML Dokuments tippen.
 
Hey, danke für die vielen Antworten! :)

Wie würde man das denn jetzt richtig machen? Was packe ich mit PHP wie in die DB (benutze ich da htmlentities()), welche Eigenschafen (nur im Bezug auf Zeichensatz) muss die DB haben und wie krieg ich den kram wieder mir PHP raus?

CPU
Frutsch! (Frohes Fest + Guter Rutsch = Frutsch) :freaky:
 
Was packe ich mit PHP wie in die DB
Ich würde dir zum Einsatz von PDOs raten, einfach weil sie relativ einfach sind, sehr flexibel und die Sicherheit deiner Anwendungen deutlich erhöht (Stichwort SQL Injections). Wenn du "normales" MySQL einsetzt, würde ich anstatt htmlentities() jedoch die von MySQL dafür vorhergesehen Funktionen wie zB. mysql_real_escape_string verwenden. Letztlich läuft das mehr oder weniger auf das gleiche hinaus, ist aber umfangreicher und eben dafür vorhergesehen. Generell: prüfe immer die Daten die von Nutzer stammen bevor sie in Queries gesteckt werden!

Eigenschafen (nur im Bezug auf Zeichensatz) muss die DB haben
Der Zeichensatz hängt davon ab, welche Sprache du verwenden willst.

Rausbekommen tust du die Daten ganz normal per Select Queries. Oben standen ja bereits zwei recht praktikable Vorschläge. Ich verwende meistens utf8_general_ci ;)
 
Zurück
Oben