MySQL Select mit Umlauten fehlerhaft...

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 10:51

Hallo,

kann mir jemand mit diesem Phänomen weiterhelfen?

Ich habe eine MySQL-Datenbank Version: 5.0.41-community-nt
Ich benutze Xampp 1.6.2 portabel installiert.

Darauf eine Datenbank mit collation: latin1_german1_ci

Alle Tabellenspalten und Tabellen haben auch diese collation.

Unter Anderem gibt es eine Tabelle mit den Feldern uid (int) und keyword (varchar 100). Darin werden nun Keywords gespeichert. Dabei ist mir aufgefallen dass manche Keywords nicht gespeichert werden. Beispielsweise die zwei Keywords:

cheats fur pc
cheats für pc

Das erste ist ein Typo der halt auch so gespeichert werden soll. Das Problem ist dass nur das erste Keywort gespeichert wird. Wenn beim zweiten Keywort angekommen ist dann wird ein select ausgeführt mit "where keyword = 'cheats für pc'". Dabei wird aber als Ergebnis der Datensatz von "cheats fur pc" zurückgeliefert. Das ist natürlich so nicht richtig.

Wie kann ich dass denn lösen?

Also, wenn ich die Tabellen lösche mit:

delete FROM `tab_keywords`;

und dann diese SQL-Anweisungen ausgeführt werden:

SELECT * FROM tab_keywords as t1 where t1.keyword = 'Cheats fur PC'
insert into tab_keywords (keyword) values('Cheats fur PC')
uid=2302
SELECT * FROM tab_keywords as t1 where t1.keyword = 'Cheats für PC'
uid=2302

dann wie man sieht passiert das was nicht passieren sollte...

Wenn ich noch einmal lösche und direkt in phpmyadmin diese beiden zeilen ausführe dann erhalte ich ebenso den falschen Datensatz:

insert into tab_keywords (keyword) values('Cheats fur PC')
SELECT * FROM tab_keywords as t1 where t1.keyword = 'Cheats für PC'

Wie gesagt ist mir dieses Verhalten bisher nicht begegnet...

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Pitze » 10. April 2009 14:07

Hej,
lass die direkten Umlaute weg und verwende anstelle ü=ue oder ö=oe usw.
Pitze
Der grösste Vertrauensbruch ist der Blitzableiter auf der Kirchturmspitze
User avatar
Pitze
 
Posts: 210
Joined: 20. November 2003 21:38
Location: Huskvarna-Schweden
Operating System: Windows Vista

Re: MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 14:21

Das kann ja nicht die Lösung sein. Ich habe den deutschen Zeichensatz ausgewählt also sollte das auch funktionieren...

Wo liegt das Problem?

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Nobbie » 10. April 2009 15:16

Das Problem liegt dadrin, dass viele Werkzeug daran beteiligt sind, wenn ein "Select" programmiert wird. Meistens ein Editor, und/oder ein Browser etc. und alle diese Werkzeug haben (uneinheitlich) irgendwelche Zeichensätze eingestellt.

Und was in dem einen Zeichensatz so aussieht wie ein "ü", ist in der internen Binärdarstellung des anderen Zeichensatzes ein ganz anderes Zeichen - und das ist das Problem. Wer mit Umlauten in Datenbanken arbeiten will, muss von vorne bis hinten konsequent darauf achten, dass seine komplette Entwicklungsumgebung einheitlich mit dem gleichen Zeichensatz arbeitet - ist das nicht gewährleistet, sind die Ergebnisse der Selects unvorhersehbar.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 15:25

Du meinst verschiedene Asciicodes für Umlaute? Nur in der Datenbank werden die Umlaute auch korrekt angezeigt...

Jemand hat mir mal seine ganzen Selects geschickt. Die habe ich dann in phpmyadmin reinkopiert. Siehe:

Ich habe jetzt folgenden Code ausgeführt:

CREATE TABLE `tab_keywords2` (
`uid` INT NOT NULL AUTO_INCREMENT ,
`keyword` VARCHAR( 100 ) CHARACTER SET latin1 COLLATE latin1_german1_ci NULL ,
PRIMARY KEY ( `uid` )
) ENGINE = MYISAM CHARACTER SET latin1 COLLATE latin1_german1_ci;

INSERT INTO
tab_keywords2 (
uid,
keyword
)
VALUES
(NULL, 'Cheats fur PC'),
(NULL, 'Cheats für PC');

SELECT
uid,
keyword
FROM
tab_keywords2;

Ergebnis:

1 Cheats fur PC
2 Cheats für PC

Dann:


SELECT
uid,
keyword
FROM
tab_keywords2
WHERE
keyword = 'Cheats fur PC';

mit Ergebnis:

1 Cheats fur PC
2 Cheats für PC

und:

SELECT
uid,
keyword
FROM
tab_keywords2
WHERE
keyword = 'Cheats für PC';

mit Ergebnis:

1 Cheats fur PC
2 Cheats für PC

Er findet also immer alles...


Nur bei ihm waren die Selectergebnisse korrekt. Und die Inserts habe ich direkt von einer Forumseite kopiert.

Hat wie oben zu sehen auch nichts gebracht...

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Nobbie » 10. April 2009 16:40

SebastianJu wrote:Du meinst verschiedene Asciicodes für Umlaute? Nur in der Datenbank werden die Umlaute auch korrekt angezeigt...


Nein, Du hast es nicht verstanden. Eine Datenbank kann nichts anzeigen, die speichert die Daten nur. Angezeigt werden die Daten beispielsweise im Browser, oder in einem Terminal, oder werden gedruckt, oder oder oder. Und jedes dieser Werkzeuge hat einen Zeichensatz, der die Binärdaten in Zeichen umwandelt.

SebastianJu wrote:Die habe ich dann in phpmyadmin reinkopiert.


Und da phpmyadmin üblicherweise im Browser läuft, wird die Darstellung der Umlaute vom eingestellten Zeichensatz im Browser abhängen. Wenn nun beispielsweise phpmyadmin im Browser mit Zeichensatz "utf8" läuft (so wie dieses Forum auch), dann kommen die Umlaut im Select falsch an, denn in der Datenbank steht ja kein utf8 sondern latin1.

Stelle mal oben im Browser (beispielsweise im firefox) unter "Ansicht"->"Zeichenkodierung" auf "ISO-8819-1" um und schau mal, was in diesem Beitrag die Umlaute machen.

Und wenn Du in einem PHP Script einen "Select ..." codierst, dann benutzt Du nicht einen Browser, sondern einen Editor, und der hat ggf. wieder einen anderen Zeichensatz eingestellt. Und dann kommt wieder nicht das heraus, was Du gerne hättest.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 16:41

Es scheint wohl mit der collation zu tun zu haben. Siehe:

http://dev.mysql.com/doc/refman/5.1/en/ ... ffect.html

Nur leider weiß ich nun nicht wie ich es hinbekomme dass bei selects ae, ä und a als unterschiedliche Dinge angesehen werden...

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Nobbie » 10. April 2009 16:47

SebastianJu wrote:Es scheint wohl mit der collation zu tun zu haben. Siehe:

http://dev.mysql.com/doc/refman/5.1/en/ ... ffect.html


Ja, ist auch konsequent.

SebastianJu wrote:Nur leider weiß ich nun nicht wie ich es hinbekomme dass bei selects ae, ä und a als unterschiedliche Dinge angesehen werden...


Sieht man doch am Beispiel-Select: nur mit "CHARACTER SET latin1 COLLATE latin1_german2_ci" wird zwischen a und ä unterschieden.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Nobbie » 10. April 2009 16:52

Gemäß http://dev.mysql.com/doc/refman/5.1/en/ ... llate.html könnte es ausreichen, wenn Du im Select den COLLATE angibst.

Also statt

SELECT * FROM tab_keywords as t1 where t1.keyword = 'Cheats für PC'

versuche es mal mit

SELECT * FROM tab_keywords as t1 where t1.keyword = 'Cheats für PC' COLLATE latin1_german2_ci
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 17:08

Das würde mir aber nichts nützen weil mit ci1 oder ci2 entweder ue=ü oder u=ü ist. Das heißt ich hätte immer einen von den drei Versionen die ich nicht benutzen könnte.

Aber... ich habe jetzt die Lösung... :)

Statt varchar(100) benutze ich jetzt varbinary(100). Und nun kann ich in dieses uniquefeld die drei Versionen einbauen ohne Fehlermeldung:
'cheats fur pc'
'cheats für pc'
'cheats fuer pc'

Außerdem kann ich nun selects auf alle drei Versionen fahren und es werden jeweils immer die richtigen erkannt.

Offenbar wurden diese Restriktionen bei älteren MySql-Versionen nicht so eng gesehen aber später schon. Jedenfalls scheint es jetzt endlich zu klappen. Ich glaube ich nehme in Zukunft nur noch varbinary statt varchar. Bringt ja nichts wenn man irgendwann später während die Software läuft Fehler bekommt an die man nicht gedacht hätte...

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Xardas der Dunkle » 10. April 2009 17:29

Das ist, aber unsauber! Und vor allem denke ich das es trotzdem nicht korrekt funktioniert, da die Ausgabe immer noch einen anderen Zeichensatz verwendet.
Oder man macht es wie dieses Forum und nimmt utf8_bin oder einen anderen unicode Zeichensatz für die Datensätze.
Stellt am Anfang jedes Script einmal den Zeichensatz von MySQL auf utf-8 um:
Code: Select all
SET NAMES 'utf8'


Sorgt mit einem:
Code: Select all
header('Content-Type: text/html; charset=utf-8');

und am besten auch noch mit dem entsprechenden Meta-Tag:
Code: Select all
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

dafür das der Browser die Ausgabe korrekt darstellt und das Problem ist grundlegend gegessen von PHPs nicht unicode sicheren str* Funktionen mal abgesehen :lol:.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Nobbie » 10. April 2009 18:16

SebastianJu wrote:Das würde mir aber nichts nützen weil mit ci1 oder ci2 entweder ue=ü oder u=ü ist.


Nö. Zitiere bitte die Stelle, wo das steht, ich zitiere dagegen auch mal was:

Two of the above collations have an A = Ä equality, and one has no such equality (latin1_german2_ci).


Und ue=ü ist nie der Fall, egal welche Collation. Du verwechselst das mit den Sortierregeln, da hat ue den gleichen Rang wie ü - aber sortieren ist nicht selektieren. In einer WHERE-Klausel wird ü nie als ue interpretiert.

Statt sich so einen Quatsch auszudenken, solltest Du doch einfach mal etwas probieren, wenn man sich schon die Schweinemühe macht, das für Dich zu ermitteln. Ich verstehe das wieder mal nicht, wozu fragst Du, wenn Du doch alles (vermeintlich) besser weißt. Statt es einfach mal zu testen.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 18:38

@Xardas der Dunkle

Meinst du der Browser verwendet den falschen Zeichensatz? Also ich mache es grundsätzlich so dass, wenn ich Umlaute benutze die in der Form von &uuml; und ähnlich in meinem Code benutze. Damit dürfte es unabhängig vom Zeichensatz sein. Bei Texten die ich aus einer Datenbank hole hatte ich dahingehend aber noch nie Probleme mit der Anzeige. Ich werde die Ausgabe mal am Ende testen mit falschen Zeichensätzen. Falls da etwas falsch angezeigt wird lasse ich die Texte halt mit einer Stringersetzung von zB ü auf &uuml; umwandeln. Dann sollte das keine Probleme mehr geben.

@Nobbie

> Zitiere bitte die Stelle, wo das steht

http://dev.mysql.com/doc/refman/5.1/en/ ... -sets.html

latin1_german1_ci (dictionary) rules:

Ä = A
Ö = O
Ü = U
ß = s

latin1_german2_ci (phone-book) rules:

Ä = AE
Ö = OE
Ü = UE
ß = ss

Womit keins von beiden für mein Problem passt. Und diese Regeln gelten eben nicht nur fürs Sortieren sondern auch für normale Selects. Das habe ich ausprobiert.

> Statt sich so einen Quatsch auszudenken, solltest Du doch einfach mal etwas probieren, wenn man sich schon die Schweinemühe macht, das für Dich zu ermitteln. Ich verstehe das wieder mal nicht, wozu fragst Du, wenn Du doch alles (vermeintlich) besser weißt. Statt es einfach mal zu testen.

Gehts noch? Schlechten Tag gehabt oder wo kommt die Wut her? Und ja, ich habe alles probiert...

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Re: MySQL Select mit Umlauten fehlerhaft...

Postby Xardas der Dunkle » 10. April 2009 18:49

Falls da etwas falsch angezeigt wird lasse ich die Texte halt mit einer Stringersetzung von zB ü auf &uuml; umwandeln. Dann sollte das keine Probleme mehr geben.


Altbacken, aber ok. Wenn du dir mal den Quelltext dieses Forums anguckst, wirst du feststellen das hier keine Umlaute escaped sind, hat auch seinen Grund. Kennst du etwa die Escape-Sequenzen für Kyrilisch oder Kanji?
Entweder gibt es diese gar nicht oder es dürften zumindest bei den Kanji ziemlich viele sein, weshalb mal heutzutage Seiten lieber direkt in Unicode darstellt.

Meinst du der Browser verwendet den falschen Zeichensatz?

Jein, er verwendet den er von Server mitgeteilt bekommt bzw. den der Benutzer eingestellt hat. Häufig: ISO-8819-1
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: MySQL Select mit Umlauten fehlerhaft...

Postby SebastianJu » 10. April 2009 19:13

Ich verwende im Quelltext iso-8859-1. Kanji einzubauen hatte ich bisher nicht vor. Da ist vermutlich die ganze Sprache aus Sonderzeichen bestehend und das einzeln zu kodieren wäre sicher sinnfrei. Im Moment wird das Skript aber nur für Englische und deutsche Zeichen verwendet...

UTF-8 verwendet das Forum. Das hatte ich auch mal genutzt aber ich weiß nicht mehr warum aus irgendeinem Grund wieder abgeschafft. Na erstmal reicht es wie es ist...

Danke soweit an alle!

Grüße!
Sebastian
SebastianJu
 
Posts: 12
Joined: 31. May 2007 20:24

Next

Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 12 guests