php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.07.2011, 10:06  
Neuer Benutzer
 
Registriert seit: 05.09.2008
Beiträge: 15
Hagbard-Celine befindet sich auf einem aufstrebenden Ast
Standard Verständnisfrage MySQL Encoding

Hallo zusammen,

in diesem Post soll es nicht um die Frage gehen wie stelle ich meine Datenbank von latin auf utf8 um, sondern nur um eine reine Verständnisfrage.

Ich habe gelesen, dass man für die Umstellung nicht unbedingt auch die DB/Tabellen/Felder auf UTF-8 konvertieren muss, sondern es reicht, wenn man die Verbindung zwischen Client/Server auf UTF-8 stellt. Der Server würde dann z.B. die latin1 Daten vor dem versenden in UTF-8 umwandeln, sodass es wieder passt.

Soweit ich das verstanden habe, ist das möglich, da die Werte intern alle Binär vorliegen und so in jedes beliebige Charset/Encoding gebracht werden können.
Teilweise konnte ich das auch nachvollziehen, aber im folgenden Fall nicht:

Ich habe eine Datenbank/Tabelle in "latin1_swedish_ci" und möchte dort z.B. ein Wort in kyrillisch speichern (Компания).
Latin1 umfasst zwar nicht die Buchstaben, die dafür notwendig wären, aber nach meinem Verständnis müsste es trotzdem gehen das Wort erstmal Binär abzuspeichern.

Beim auslesen via PHP würde ich dann UTF-8 benutzen, mit dem die Darstellung prinzipiell möglich ist. Jedoch funktioniert das bei mir nicht. Ich bekomme einfach nicht das Wort angezeigt, sondern entweder nur "????????" oder aber "Компания".


Mit folgenden beiden (vereinfacht) Scriptenvarianten habe ich es versucht:

Insert in Latin auslesen in UTF-8

PHP-Code:
mysql_query("SET NAMES 'latin1'");
mysql_query("SET CHARACTER SET 'latin1'");
mysql_query("INSERT INTO t VALUES('Компания')");
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
$q mysql_query("SELECT * FROM t");
while(
$erg mysql_fetch_assoc($q))
{
    echo
"<pre>";print_r($erg);echo"</pre>";

Insert in UTF-8 auslesen in UTF-8

PHP-Code:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("INSERT INTO t VALUES('Компания')");
$q mysql_query("SELECT * FROM t");
while(
$erg mysql_fetch_assoc($q))
{
    echo
"<pre>";print_r($erg);echo"</pre>";


Mir geht es wie gesagt nicht darum, ob das was ich da mache, sinnvoll ist sondern nur um das Verständnis. Da dies nicht funktioniert muss ich ja irgendwo einen Denkfehler haben. Auch Google konnte mich in diesem speziellen Fall nicht weiter bringen.

Ich freue mich über Feedback.

Danke
Hagbard-Celine ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 22.07.2011, 10:46  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

das Problem ist halt, dass in Latin Swedish eben KEIN BINÄRCode vorgesehen ist, der zu kyrillischen UTF-8 Buchstaben passt (im Zeichensatz fehlen halt Zeichen) -

dadurch ist diese Umkodierung eine "EinwegVeranstaltung" - weil dir wie du selbst siehst der Rückweg versperrt bleibt

das Problem ist nämlich dass bei der Rückkonvertierung zu utf8 nicht über den Binärcode gearbeitet wird, sondern über das Zeichen
und wenn du latin-swedish nach dem Binärcode für ein kyrillisches kleines "k" fragst - sagt der Zeichensatz nur noch "?" = kenn ich nicht - und das ? zurückkodiert bleibt ein ?.
der andere Fall mit diesem Zeichenkauderwelsch - ist auch leicht erklärbar ... Latin ist ein 8 bit Zeichensatz mit 256 theoretisch möglichen Zeichen. Utf8 verwendet mehr Bytes pro Zeichen. Durch die Konvertierung von utf8 zu Latin ist diese Zuordnung der Bytes aufgehoben, jedes Byte wird in ein eigenes Latin Zeichen umgewandelt - und woran soll der dann bei der Rückwandlung erkennen, welche Bytes zusammengehören zu einem Utf8-Zeichencode? - brauchst nicht raten - er kann es nicht erkennen, also bekommst du diesen Zeichenmischmasch, der jedes einzelne Byte halt im Utf8-Satz wieder darstellt ... nur nicht deine kyrillischen Buchstaben


Im Gegensatz zu deinem Material habe ich gelernt, dass man am besten ALLES auf UTF8 umstellt ... denn dann muss die Datenbank nix umkodieren
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

Geändert von eagle275 (22.07.2011 um 10:51 Uhr).
eagle275 ist offline   Mit Zitat antworten
Alt 22.07.2011, 11:22  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Hier hast du etwas Lesestoff dazu:

Die 5 goldenen Regeln für UTF-8 in PHP/MySQL und HTML:
http://www.php.de/datenbanken/55699-...tml#post430223 (Umlaute in MySQL Datenbank)

Der ultimative Megakick der Superlative
http://www.php.de/adventskalender-20...perlative.html (27: Der ultimative Megakick der Superlative)

und der Vollständigkeit halber nach Blick auf deinen Beispielcode:

Warum soll ich nicht SELECT * schreiben?
http://php-faq.de/q-sql-select.html
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 22.07.2011, 11:39  
Neuer Benutzer
 
Registriert seit: 05.09.2008
Beiträge: 15
Hagbard-Celine befindet sich auf einem aufstrebenden Ast
Standard

Hallo Ihr beidem

zunächst vielen Dank für das Feedback.

@eagle275
Keine Sorge ich habe auch gelernt das, zumindest mehrsprachige Projekte, direkt und komplett in UTF-8 umzusetzen sind.
Trotzdem wollte ich wissen, wieso auch der Weg über SET NAMES funktioniert. Das ist reine Neugier um zu verstehen wie
das ganze funktioniert.

Deine Information das die Rückkonvertierung nicht über den Binärcode arbeitet, ist da Goldwert, dass erklärt das Problem natürlich. Hast Du dazu vielleicht noch eine Quelle oder ein Stichwort in der MySQL-Doku (http://dev.mysql.com/doc/refman/5.1/de/index.html) ?

Dann ist es also so, dass die Rückkonvertierung immer nur dann funktioniert, wenn es auch die eingegebenen Zeichen in beiden Encodings gibt. Also Latin-1 nach UTF-8 via SET NAMES funktioniert z.B: bei Deutschen Texten inkl. Umlauten.

@Wolla

Vielen Dank, vorallem für den zweiten Link darin waren noch ein paar nützliche Informationen.
Und auch dich kann ich beruhigen, ich weiß warum das * nicht verwendet werden sollte, ein
opfer meines vereinfachten Beispielcodes.
Hagbard-Celine ist offline   Mit Zitat antworten
Alt 22.07.2011, 12:32  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

leider hab ich keinen Link dazu - aber die Hinweise zum Encoding stecken ja in Wolla's Links
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 22.07.2011, 12:54  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Zitat:
Trotzdem wollte ich wissen, wieso auch der Weg über SET NAMES funktioniert. Das ist reine Neugier um zu verstehen wie das ganze funktioniert.
Kontextwechsel ist dein Stichwort.

Und warum das funktioniert? Weil der Treiber (die Client Lib) den Kontextwechsel korrekt durchführt, im Gegensatz zu manchem Programmierer, der vielleicht den Treiber auf UTF-8 einstellt, dann aber ISO Daten liefert.

Das "Wie" ist auch schnell erklärt:
Man teilt dem Treiber mit "benutze Encoding xyz" - zusätzlich MUSS man ihm dann die Daten auch in dem Encoding bereitstellen, welches man ihm mitgeteilt hat.
Bei der Datenbank angekommen, fragt der Treiber "welches Encoding gilt für die Zieltabelle" und er konvertiert die Daten dann von seinem Transportencoding in das von der Datenbank genannte Zielencoding (oder er sagt der Datenbank, "hier hast du Daten im Encoding xyz, mach damit was du willst" und die Datenbank kodiert sie um)
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz 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
Mysql funktioniert nicht (Erweiterung nicht erkannt!?) pfump Server, Hosting und Workstations 10 17.03.2012 11:07
PHP Zugriff auf MySQL Community Server gewähren daemonTutorials Datenbanken 8 21.02.2011 12:28
MySQL Datentransfer (Dateigroesse 4MB) via Shell Zugang oder einfacher promoterlv Datenbanken 1 14.11.2010 22:12
[Erledigt] PHP bekommt keine Verbindung zu MySQL SaKe Datenbanken 15 20.09.2010 14:45
Mysql fehler bei externen Zugriff SteiniKeule Datenbanken 4 18.06.2010 12:54
PDO MySQL abfrage funktioniert nicht Bloodydead PHP Tipps 2010 8 18.06.2010 11:08
Erkenntnisse aus der MySQL -> Oracle migration Donald Datenbanken 9 13.04.2010 14:24
[Erledigt] MySQL Link Resource in einer statischen Variablen speichern Lenki PHP-Fortgeschrittene 8 18.03.2010 16:37
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
[Erledigt] Verständnisfrage OOP - Objekte in MySQL Datenbank schreiben? PHP Tipps 2005 2 19.05.2005 21:40
Access denied for user: '@localhost' / SYSTEM@localhost Datenbanken 0 10.11.2004 20:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php mysql encoding, mysql_query latin, php encode, http://www.php.de: encode kyrill*, php encode umlaute t omysql, php mysql_query set names latin, php mysql set charset latin1 swedish, encoding einfach erklärt utf8, problem mysql sonderzeichen latin1 swedish, mysql_query encoding, mysql encode(), charset mysql datenbank auslesen, mysql select charset, nur datenbank auf latin swedish, datenbank von latin swedish auf utf-8 probleme, mysql codierung auslesen, php charset auslesen und umwandeln, mysql_query charset umlaute, mysql umlaute insert into encode, utf8 encode mysql datenbank auslesen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:10 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