like wird case sensitive

Michael Engel

Erfahrenes Mitglied
Eigentlich sind LIKE bedinungen ja case-insensitive. Ich habe jetzt eine Suchefunktion in meine Applikation eingebaut. Die query`s die abgesendet werden sehen mit bedinungen aus wie diese:

SQL:
SELECT `debitornummer` ,
    (SELECT GROUP_CONCAT(k.`ursprung`,' ',k.`kundennr` SEPARATOR ' ') FROM `wi_kunden` as k WHERE k.`debitornummer` =`wi_inkasso`.`debitornummer`)as knrs,
     `name_firma1`, `vorname_firma2` , DATEDIFF(
            NOW( ) , `lastupdate` ) as `alter`, (
            SELECT sum( `betrag_teilforderung_brutto` )
            FROM `wi_teilforderung`
            WHERE `inkasso_debitornummer` = wi_inkasso.debitornummer
            ) AS betrag,
            `ort`, `postleitzahl_ort`, CONCAT(`strasse`, ' ',`hausnummer`) as strasse
            FROM `wi_inkasso`
            WHERE `user_uid` = '1'  AND (`debitornummer` LIKE '%dd%'
             OR `vorname_firma2` LIKE '%dd%'
             OR `ort` LIKE '%dd%'
             OR `postleitzahl_ort` LIKE '%dd%'
             OR `hausnummer` LIKE '%dd%'
             OR `name_firma1` LIKE '%dd%'
             OR `strasse` LIKE '%dd%'
             OR (SELECT GROUP_CONCAT(k.`ursprung`,k.`kundennr` SEPARATOR ' ') FROM `wi_kunden` as k WHERE k.`debitornummer` =`wi_inkasso`.`debitornummer`) LIKE '%dd%')
            ORDER BY `name_firma1` ASC
            LIMIT 100

Soo und nun sind die ergebnisse die aus der Subquery kommen case sensitive. mit einer suche nach dd findet man nicht DD. In allen anderen bedinungen klappt es. Ist das immer so wenn man mit Subquery`s arbeitet? Und muss man wirklich die eine Query 2 mal hinschreiben, wenn man das eine select feld auch als bedinungen haben möchte?
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

Eigentlich sind LIKE bedinungen ja case-insensitive.

Das würde ich so nicht unterschreiben.
Wie verglichen, sortiert usw. wird hängt vom RDBMS, Characterset und von den COLLATION-Settings ab. Die kann man pro Connection, (Instanz), Datenbank, Tabelle, Tabellenspalte oder aber Statement-Level unterschiedlich festlegen.

Ich gehe davon aus, dass in irgendeiner deiner Tabellen die du in der Subquery verwendest andere Character-Set-Settings oder andere COLLATE-Settings vorhanden sind.

Um zu prüfen, ob die Bedingungen überhaupt case-insensitiv funktionieren, ändere mal deine LIKE '%dd%' zum Testen mal so ab:

SQL:
<feldname> LIKE '%dd%' COLLATE latin1_german2_ci

... und schau ob er dann was findet.


In den Tabellen

"information_schema.tables" bzw
"information_schema.columns" findest du die Collate-Settings zu deinen Tabellen und -Spalten.

Markus
 
Also in der Subquery war das eine Feld INT und das andere CHAR mit COLLATE latin1_german2_ci.

Hatte gedacht das das reichen würde, aber irgendwie durch das Concat scheint er das Collate zu zerstören. Naja vielen dank mit der Expliziten nennung funktioniert es auf jeden fall.
 
Zurück