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 13-07-2009, 11:24
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard Bär = Bar in utf8_general_ci

Ich finde jede Menge Info zum Thema aber kein Workaround. Ich habe eine mySQL-Datenbank in utf8_general_ci.
Mache ich nun ein

SELECT * FROM tabelle WHERE name LIKE "%Bar%"

bekomme ich neben "Bar" in den Ergebnissen auch "Bär".
Das Verhalten ist so bekannt und definiert, paßt mir aber nicht.
Weiß jemand einen Weg, dieses Verhalten zu ändern, ohne die Kollation umstellen zu müssen? Am Besten direkt in der Query?

SELECT * FROM tabelle WHERE BINARY name LIKE "%Bar%"

ist leider zuviel des Guten: Damit wird die Abfrage case sensitive, was ich aber vermeiden möchte.
Mit Zitat antworten
  #2 (permalink)  
Alt 13-07-2009, 12:24
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

MySQL :: MySQL 5.0 Reference Manual :: 9.1.6.1 Using COLLATE in SQL Statements
Mit Zitat antworten
  #3 (permalink)  
Alt 13-07-2009, 16:10
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

oder weiter mit BINARY, aber vorher upper bzw lower machen
Code:
select lower('Bär')=binary(lower( 'Bar'))
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #4 (permalink)  
Alt 15-07-2009, 09:57
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

COLLATE wär's im Grunde, klappt hier aber nicht auf Anhieb, weil die einzige Collation die ich nutzen kann latin_german2_ci ist - und das verträgt sich nicht mit UTF8.

Lower() geht nicht mit LIKE - außer ich "lower"e das ganze abzufragende Feld, was wiederum performancemäßig nix ist.

Weiß jemand auf Anhieb, was ich wo CONVERTen muß, um die Abfrage in latin_german2_ci zu kriegen und COLLATE nutzen zu können?
Mit Zitat antworten
  #5 (permalink)  
Alt 15-07-2009, 12:07
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von pekka Beitrag anzeigen
Lower() geht nicht mit LIKE - außer ich "lower"e das ganze abzufragende Feld, was wiederum performancemäßig nix ist.


Klappt das so?

Code:
SELECT * FROM tabelle WHERE LOWER(name) LIKE CONCAT("%", LOWER("Bar"), "%");
Wenn das unter WHERE nicht klappt, evtl. mit HAVING testen ...
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #6 (permalink)  
Alt 15-07-2009, 12:43
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Genau das lowert ja jedes Feld in der Datenbank, was natürlich Performance kostet. Oder was denkst du, was LOWER(name) macht?
Mit Zitat antworten
  #7 (permalink)  
Alt 15-07-2009, 13:12
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Ausprobieren ... wie stark die Belastung ist.

DESC SELECT ....
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #8 (permalink)  
Alt 15-07-2009, 13:15
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

lower macht natürlich genau so viel bremse wie collationsänderung am laufendem.
Was ich mir noch vorstellen kann, dass man erst zwischenergebnis in eine Temporäre-Tabelle abspeichert, um die Suche abzugrenzen und dann in dem zweitem Schritt lover oder replace macht und noch ein mal like anwendet.
In diesem fall wird lover oder replace nicht auf die ganze spalte, sondern auf die vorselectierte Ergebnis wirksam

nicht getestet!
SELECT t1.* from tabelle as t1 inner join (SELECT id, replace(name,'ä','') as neuname FROM tabelle WHERE name LIKE "%Bar%")as Schritt1 on t1.id=Schritt1.id where Schritt1.neuname like "%Bar%";
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #9 (permalink)  
Alt 15-07-2009, 14:16
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von pekka Beitrag anzeigen
weil die einzige Collation die ich nutzen kann latin_german2_ci ist
Warum?

Collations sind in erster Linie dazu da, anzugeben, wie Vergleiche durchgeführt werden sollen - welche Zeichen man also als gleichwertig angesehen haben möchte.

Du hast jetzt eine gewählt, die a==ä setzt - und wilst aber genau dieses "Feature" gar nicht haben?


Wenn es da aus irgendwelchen ungünstigen Umständen wirklich keine Möglichkeit geben sollte, eine günstigere Collation zu wählen - dann mach halt eine extra Spalte, entweder die schon gleich mit passenderer Collation versehen, oder wo du das Ergebnis von LOWER redundant vorhältst, und nutze diese zum Vergleichen, wenn du dir andernfalls Sorgen um die Performance machst.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #10 (permalink)  
Alt 16-07-2009, 01:53
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Du hast jetzt eine gewählt, die a==ä setzt - und wilst aber genau dieses "Feature" gar nicht haben?
Welche UTF8-Basierende Kollation macht das denn nicht?
Mein Problem ist nicht, daß ich die Kollation gar nicht wechseln kann. Nur zu den Latins will ich nicht mehr.
Das mit der Extra-Spalte ist alternativ aber eine gute Idee.

Geändert von pekka (16-07-2009 um 01:59 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 16-07-2009, 02:04
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Ausser utf8_bin gibt's wohl keine; aber damit wird's dann wieder cs - dann bleibt ausser LOWERn vorm vergleichen wohl wirklich keine Möglichkeit.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #12 (permalink)  
Alt 16-07-2009, 10:03
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Ich denke, ich werde auf Dauer Extra-Spalten anlegen, die in latin1_german_ci gehalten sind. Bis dahin behelfe ich mir mit lower() oder filtere unerwünschte Ergebnisse im PHP-Code aus. Vielen Dank für die Beiträge!
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 05:14 Uhr.