php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.03.2007, 20:06  
Neuer Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 3
erna
Standard Verständnisprobleme bei Utf8 > Character Set > Collate

Hallo allen,
bin neu hier im Forum und hoffe einfach nur, das ich dadurch MySql besser verstehen lerne. Das, was ich bisher über Utf8 habe lesen können, hat mir zumindensten ein grobes Verständnis gewährleistet. Jedoch habe ich ein rudimentäres UTF8-Verständnisproblem, da eine Sortierung, so wie ich sie will, scheinbar nicht möglich ist. Von meinem Provider (den ich mal angesprochen habe) wurde schon ein Workaround nahegelegt, wo ich den UTF8-Inhalt nochmals als Latin1 in einer separaten Spalte speichern solle und ehrlich gesagt, ich kann mir nicht vorstellen, dass dieser Rat der Weisheit Schluss ist:

1. MySql-Version 4.1..

2. Die Tabelle
CREATE TABLE test (test varchar(20) COLLATE utf8_general_ci DEFAULT '' NOT NULL)
default character set = utf8 COLLATE=utf8_general_ci;

3. Die Daten werden über ein CMS-System Typo3 eingegeben. Diese sind jedoch genauso in den Tabellen, wie wenn ich sie mit z.B. CONVERT(_latin1'Ö' USING utf eingegeben hätte vorhanden.

4. Meine Inhalte im Original werden im phpMyAdmin in der Tabelle folgendermassen dargestellt:
Olive > Olive
Öl > Öl
Dill > Dill
Distelöl > Distelöl

5. Meine relevanten Umfeldvariablen
SHOW VARIABLES LIKE '%collation%'
collation_connection utf8_general_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci

SHOW VARIABLES LIKE '%character%'
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_results utf8
character_set_server latin1
character_set_system utf8

6. Mein Select im phpMyAdmin:
SELECT test FROM test ORDER BY test COLLATE utf8_general_ci;
Das collate müsste ich nicht unbedingt mit angeben, da bereits auf der Spalte beim Create das Collate liegt.

7. Das Ergebnis meines Selects mit aus meiner Warte nicht richtiger Sortierung
Öl > Öl
Dill > Dill
Distelöl > Distelöl
Olive > Olive

Wo ist der Zusammenhang bzw. die Brücke des Verständnisses. Es ist eindeutig, dass MySql nicht erkennt, dass es sich um zu sortierende Unicode-Daten handelt, nur warum?

Gruss Erna
erna ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 19.03.2007, 23:13  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

Hi
es Gibt mehrere Faktoren.
character_set_server ist latin1
das bedeutet, dass du als erstes operation
mysql_query("SET NAMES 'utf8'");
machen muss.
ausserdem muss du 100% sicher sein, dass der formular, als auch die seiten, die daten auslesen unbedingt utf-8 sein müssen.
dabei ist metha tag mit charset keine Garantie dafür, dass es wirklich utf-8 ist.
am bestens sendet mann ein passender header
header('Content-Type: text/html; charset=utf-8');
wenn du das so machst, dann werden auch die über formulare eingetragende Daten in MyAdmin richtig angezeigt.
Die Daten die du schon in Db hast, muss man aber ändern.
Ich habe mit Typo3 keine Erfahrungen gemacht, aber es sieht so aus, dass die daten mit falschem charset übertragen wurden.
komische daran ist, dass man am meistens erst bei sortieren merkt, das da was falsch gelaufen ist.
__________________
Slava
http://bituniverse.com
Slava ist offline   Mit Zitat antworten
Alt 20.03.2007, 07:23  
Neuer Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 3
erna
Standard

Hallo Slava,

danke für Deine Rückmeldung. Auf HTML-Seite ist der charset gesetzt und die Daten werden korrekt angezeigt. Das einzige, was nicht funktioniert ist wirklich die Sortierung und das wurmt mich.

Wenn ich mal komplett den Kladeradatsch mit php und html beiseite lassen würde und mich nur auf den phpMyAdmin und MySql versteifen würde ... da kommt mir eine Idee. Ich glaube ich muss einfach nochmal testen, mit dem Set Names von Dir. Melde mich, sobald ich das auch hinter mich gebracht habe.

Gruss Mensch
erna ist offline   Mit Zitat antworten
Alt 20.03.2007, 08:16  
Neuer Benutzer
 
Registriert seit: 19.03.2007
Beiträge: 3
erna
Standard

Slava, Du hast recht! Scheint es nicht so, dass genau das gleiche passiert wie unten beschrieben. Also, dass beim Befüllen der Tabelle irgendwie nicht UTF8 aktiviert ist bzw. erkannt wird und ich dann diese kryptischen nicht sortierbaren Zeichen erhalte?

Meine Antwort von eben:

So, bin noch weniger schlauer als vorher. Habe wieder mal eine Testtabelle generiert:
Code:
CREATE TABLE test (
  FSetNames varchar(10) character set latin1 COLLATE latin1_german1_ci,
  FUtf8 varchar(5) character set utf8 COLLATE utf8_general_ci,
  FLatin1 varchar(5) character set latin1 COLLATE latin1_german1_ci,
  FLatin5 varchar(5) character set latin5 COLLATE latin5_turkish_ci
);
Und habe folgende Inserts durchgeführt
Code:
Set names utf8;
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','A','A','A');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','Ä','Ä','Ä');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','C','C','C');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','Ç','Ç','Ç');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','O','O','O');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','Ö','Ö','Ö');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','S','S','S');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('1 Utf8','Ş','Ş','Ş');

Set names Latin1;
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','A','A','A');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','Ä','Ä','Ä');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','C','C','C');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','Ç','Ç','Ç');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','O','O','O');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','Ö','Ö','Ö');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','S','S','S');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('2 Latin1','Ş','Ş','Ş');

Set names Latin5;
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','A','A','A');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','Ä','Ä','Ä');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','C','C','C');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','Ç','Ç','Ç');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','O','O','O');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','Ö','Ö','Ö');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','S','S','S');
Insert into test (FSetNames, FUtf8, FLatin1, FLatin5) values ('3 Latin5','Ş','Ş','Ş');
Und folgendes Ergebnis ist bei phpMyAdmin zu sehen:
  • Set Names Utf8 Latin1 Latin5
    1 Utf8 Ä Ä Ä
    1 Utf8 C C C
    1 Utf8 Ç Ç Ç
    1 Utf8 O O O
    1 Utf8 Ö Ö Ö
    1 Utf8 S S S
    1 Utf8 Ş ? Ş
    2 Latin1 A A A
    2 Latin1 Ä Ä �
    2 Latin1 C C C
    2 Latin1 Ç Ç �
    2 Latin1 O O O
    2 Latin1 Ö Ö �
    2 Latin1 S S S
    2 Latin1 Åž Åž Å?
    3 Latin5 A A A
    3 Latin5 Ä Ä Ä
    3 Latin5 C C C
    3 Latin5 Ç Ç Ç
    3 Latin5 O O O
    3 Latin5 Ö Ö Ö
    3 Latin5 S S S
    3 Latin5 Åž Åž Åž
Was kann man aus diesem Ergebnis schlussfolgern? Mein Gott, bald blicke ich überhaupt nicht mehr durch - von wegen Verständnis.
Gruss Erna
erna ist offline   Mit Zitat antworten
Alt 20.03.2007, 14:08  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

1)mit SET NAMES überprüfst du nicht charset, sondern du setzt charset.
2)es sieht genau so aus, wie es sein muss

Wie ich schon gesagt habe, muss nicht nur verbindugs-charset, sondern auch charset von der Seite, gleiche charset haben.
Jetzt versuchen wier nachvollziehen was wir hier gemacht haben
1)Seite ist auf utf-8 gesetzt(richtig, wenn wir mit utf-8 arbeiten wollen)
2)verbindungs-charset auf utf8 gesetzt (richtig, wenn wir mit utf-8 arbeiten)
als Ergebnis, stimmen alle Eingaben und werden auch richtig dargestellt.
Der Feld 'FUtf8' ist 100% richtig gefühlt worden.
Aber Aber Aber!, wir haben da noch die andere felder, FLatin1 und FLatin5, die andere charset haben! das bedeutet, dass diese Felder auch die entsprechende charset bei einfügen brauchen und zwar db-verbindung als auch charset von dem formular müssen zusammenpassen.
Das heist, dass wenn du in deiner Tabelle die spalten mit verschiedenen zeichensätzen hast, dann muss du auch, in fall, dass der charset von eingabeformular und der verbindung nicht gleich gesetzt sind eine umwandlung von charset vornemen.
also in unserem 1-em fall müsstest du mit iconv die mit utf-8 angekommene zeichen aus utf-8 in latin1 bzw latain5 umwandeln.
Und am ende würden wir bei versuch, auf einer seite die inhalte mit verschiedenen charset zu zeigen garantiert immer darstellungs probleme bekommen, im fall, dass alle inhalte mit dem anderem als auf der seite charsets nicht von uns exact an der Seiten-charset angepasst werden.

Es ist mir leider nicht so leicht, alles auf deutsch zu erklären , da ich andere muttersprache habe

also mache ich dir kurz ein Regel für den zukunft.
1)header() mit dem charset immer senden.
2)nur die Felder, die gleiche collation, feld-charset, verbinduns-charset, und Seiten-charset haben, darfst du ohne zusätzlichen charsets umwandlungen Anzeigen, Einfügen und Bearbeiten.
3) bei allen neuen Mysql-Versionen, so lange der verbindungs-charset nicht stimmt, (oder auch einfach zum sicherheit) SET NAMES 'passendecharset'
ausführen
(bitte beachten!, dass charsets-namen nicht immer bei mysql gleich heissen, z.b.s utf-8 heisst 'utf8' bei Mysql. Immer Dokumentation anschauen, wenn man nicht sicher ist ).
__________________
Slava
http://bituniverse.com
Slava 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
insert into funktioniert nicht mafra PHP Tipps 2008 10 08.03.2008 15:38
mysql Anführungszeichen werde falsch dargestellt trotz UTF 8 bomber Datenbanken 0 14.02.2008 21:18
phpmydatagrid sieberforst PHP Tipps 2008 3 10.10.2007 05:52
character set database marvel Datenbanken 3 05.07.2007 22:04
UTF8 Dump erzeugt nach import in UTF8 kod DB falsche Umlaute Carino Datenbanken 18 07.05.2007 23:49
UTF8 php und MySQL test022 PHP Tipps 2007 7 12.02.2007 23:11
Updaten Delet und Insert klappen nicht PHP Tipps 2006 13 13.06.2006 13:59
[Erledigt] SQL => CHARACTER zu DATETIME Datenbanken 1 23.08.2005 13:29
utf8 encode Text sortieren axelnes PHP-Fortgeschrittene 5 01.08.2005 15:54
[Erledigt] UTF8 und MySQL 4.0 Datenbanken 5 18.04.2005 21:31

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
default character set utf8 collate utf8_general_ci, collate utf8, utf-8 character set, default character set utf8 collate utf8_general_ci;, mysql_query(\'set character set utf8;\');, set character set utf8, utf8 collation, create database default character set utf8 collate utf8_general_ci;, set names utf8, collation utf8, http://www.php.de/datenbanken/43727-verstaendnisprobleme-bei-utf8-character-set-collate.html, phpmyadmin set character set \'utf8\';, create database default character set utf8 collate utf8_general_ci, php collate, set names \'utf8\', utf-8 collation, php collation, mysql collate utf8, set character set \'utf8\', mysql select collate utf-8

Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.