Wie kann ich mit dem LIKE-Platzhalter in einer Spalte suchen (ohne Berücksichtigung der Groß- und Kleinschreibung)?

288

Ich habe mich umgesehen und nicht gefunden, wonach ich gesucht habe.

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

Dies funktioniert gut, aber nicht, wenn der Baum Elm oder ELM usw. heißt.

Wie mache ich SQL für diese Platzhaltersuche unabhängig von Groß- und Kleinschreibung?

Ich benutze MySQL 5 und Apache.

David Morrow
quelle
3
Wenn Sie auf dieser Seite gestolpert sind, aber Ihre MySQL-Einstellungen bei dieser Abfrage für Elm oder ELM funktionieren und Sie möchten, dass zwischen Groß- und Kleinschreibung unterschieden wird, siehe BINARYhier: stackoverflow.com/questions/7857669/…
joshuahedlund
Ist es nicht abhängig von der Feld- / Tabellenkollation? wie 'ut8_general_CI'
Yousha Aleayoub
Wie benutzt man es, um die Knotenabfrage zu sequlisieren?
Ashh
Bei MySQL likesollte standardmäßig die Groß- und Kleinschreibung nicht berücksichtigt werden.
Marko Bonaci

Antworten:

281
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%'

Wenn Sie COLLATE UTF8_GENERAL_CIdie Definition Ihrer Spalte ergänzen , können Sie alle diese Tricks einfach weglassen: Es funktioniert automatisch.

ALTER TABLE trees 
 MODIFY COLUMN title VARCHAR(…) CHARACTER 
 SET UTF8 COLLATE UTF8_GENERAL_CI. 

Dadurch werden auch alle Indizes für diese Spalte neu erstellt, sodass sie für die Abfragen verwendet werden können, ohne dass '%' führt.

Quassnoi
quelle
34
Wenn Sie COLLATE UTF8_GENERAL_CIdie Definition Ihrer Spalte ergänzen , können Sie alle diese Tricks einfach weglassen: Es funktioniert automatisch. ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. Dadurch werden auch alle Indizes für diese Spalte neu erstellt, sodass sie für die Abfragen ohne führendes '%' verwendet werden können.
Quassnoi
1
ALTER TABLE tree MODIFY COLUMN title VARCHAR (…) Dies scheint der beste Weg zu sein, vielen Dank ... lass sql die Arbeit machen
David Morrow
10
Freundliche Erinnerung, dass dies eine MySQL-Antwort ist. Wenn Sie PostgreSQL verwenden, ist ILike die Lösung für die obige Frage.
Steve
2
@ RajanRawal: Bitte poste deine Frage als Frage, nicht als Kommentar. Vielen Dank.
Quassnoi
1
Dies ist die richtige Antwort, solange Ihre ursprüngliche Zusammenstellung allgemein und nicht bin war.
Greenoldman
261

Ich habe das immer mit niedriger gelöst:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%elm%'
cwallenpoole
quelle
47
und Beute Index verwenden
Ihr gesunder Menschenverstand
3
Hat MySQL 5 einen ILIKE-Operator?
Luke Maurer
27
obwohl für die %% Suche ist es sowieso egal :)
Ihr
5
@Col. - Dies ist zwar für indizierte Spalten weniger als ideal, funktioniert jedoch für eine bereits vorhandene Struktur. Ich habe auch festgestellt, dass bei Suchanfragen ohne Berücksichtigung der Groß- und Kleinschreibung häufiger Spalten verwendet werden, die ohnehin nicht indiziert sind.
Cwallenpoole
1
Die Standardkollatierung ist bereits CI. Das eigentliche Problem liegt also nicht in dieser speziellen Frage. Aber es ist immer noch eine perfekte Antwort im SO-Stil.
Ihr gesunder Menschenverstand
48

Die Groß- und Kleinschreibung wird in den Einstellungen für Spalten / Tabellen / Datenbankkollatierung definiert. Sie können die Abfrage unter einer bestimmten Sortierung folgendermaßen durchführen:

SELECT *
FROM trees
WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci

zum Beispiel.

(Ersetzen utf8_general_ciSie sie durch die für Sie nützliche Sortierung.) Das _cisteht für Groß- und Kleinschreibung nicht .

aioobe
quelle
1
In MySQL 5.6 erhalte ich FEHLER 1273 (HY000): Unbekannte Sortierung: 'utf_general_ci' . Ich würde vermuten, dass diese Sortierung aus MySQL entfernt wurde. utf8_general_cifunktioniert aber gut.
Mark Amery
1
Hatte das gleiche Problem. Sie müssen entweder Ihren Fehler beheben COLLATEoder einen einfachen Trick wie diesenLOWER()
ausführen
In MySQL 5.6+ oder MariaDB 10+ müssen Sie nur die Anweisung COLLATE vor Ihrer Bedingung angeben. Das funktioniert also:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';
Stamster
41

Dies ist das Beispiel einer einfachen LIKE-Abfrage:

SELECT * FROM <table> WHERE <key> LIKE '%<searchpattern>%'

Bei LOWER () -Funktion wird die Groß- und Kleinschreibung nicht berücksichtigt:

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
Federico Piragua
quelle
3
Eigentlich ist dies eine ziemlich COLLATE
gute
27

Verwenden Sie einfach:

"SELECT * FROM `trees` WHERE LOWER(trees.`title`) LIKE  '%elm%'";

Oder verwenden

"SELECT * FROM `trees` WHERE LCASE(trees.`title`) LIKE  '%elm%'";

Beide Funktionen funktionieren gleich

Vi8L
quelle
15

Ich mache so etwas.

Den Rest in Kleinbuchstaben und MySQL abrufen, erledigt den Rest

    $string = $_GET['string'];
    mysqli_query($con,"SELECT *
                       FROM table_name
                       WHERE LOWER(column_name)
                       LIKE LOWER('%$string%')");

Und für MySQL PDO Alternative:

        $string = $_GET['string'];
        $q = "SELECT *
              FROM table_name
              WHERE LOWER(column_name)
              LIKE LOWER(?);";
        $query = $dbConnection->prepare($q);
        $query->bindValue(1, "%$string%", PDO::PARAM_STR);
        $query->execute();
Dave Doga Oz
quelle
6

Ich denke, diese Abfrage führt eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durch:

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';
cgupta
quelle
1
Ich erhalte einen Syntaxfehler auf MySQL 5.5, während ich ILIKE in meinen Abfragen verwende
Steel Brain
18
Dies funktioniert nur für PostgreSQL. nicht MySQL. postgresql.org/docs/current/static/functions-matching.html
Martin Tournoij
Wie bereits erwähnt, handelte es sich bei der Frage um MySQL, und die Antwort bezieht sich auf PostgreSQL und funktioniert mit MySQL verdammt noch mal nicht. Ich
stimme
4

Sie brauchen ALTERkeinen Tisch. Verwenden Sie einfach die folgenden Abfragen vor der eigentlichen SELECTAbfrage, für die Sie den Platzhalter verwenden möchten:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
Lopofsky
quelle
2
Dies ist ein sehr unterschätzter Kommentar. Es befasst sich am allgemeinsten mit der Frage. Ich denke auch, dass die Syntax der Änderungstabelle wichtig ist, da die Frage den Vergleich möglicherweise nur auf diese eine Spalte beschränken soll.
Brian Chrisman
4

verwenden ILIKE

SELECT * FROM trees WHERE trees.`title` ILIKE '%elm%';

es hat bei mir funktioniert !!

ABS-Zarzis
quelle
9
MySQL unterstützt nicht unterstützt ILIKE.
Ttarchala
3
Das funktioniert für PostgreSQL, die Frage betraf MySQL.
Telmo Trooper
1

Nun, in MySQL 5.5 ist der Operator unempfindlich. Wenn Ihr Tal also Ulme oder ELM oder Ulme oder eLM oder ein anderes ist und Sie wie '% elm%' verwenden, werden alle übereinstimmenden Werte aufgelistet.

Ich kann nicht über frühere Versionen von MySQL sagen.

Wenn Sie in Oracle arbeiten und beispielsweise zwischen Groß- und Kleinschreibung unterscheiden. Wenn Sie also '% elm%' eingeben, wird dies nur für diesen Fall verwendet und Großbuchstaben werden ignoriert.

Seltsam, aber so ist es :)

user21546
quelle
Das ist nicht ganz richtig. Dies funktioniert nur dann, wenn die Sortierung *_ciauf "Groß- und Kleinschreibung nicht beachten" gesetzt ist. Da dies standardmäßig für alle unterstützten Zeichensätze gilt (Problem show character set;, dies zu überprüfen), ist die Antwort teilweise richtig :-) Nur der Grund ist falsch. Es ist nicht der Operator, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, sondern die Standardkollatierung.
Silverdr
Ja, ich stimme dir zu. Es hängt vom Zeichen ab und wenn Sie mit * _ci Zeichen in Produktion sind, besteht die einzige Option darin, die Binärdatei vor der where-Klausel zu verwenden
user21546
1
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 
user4189641
quelle
Galerie ist der Tabellenname, Name ist die Spalte in der Tabelle,
user4189641
2
Bitte fügen Sie eine Erklärung Ihres Codes hinzu, die zeigt, was er tut und wie er hilft - dies wird anderen in Zukunft helfen
Unser Mann in Bananen
0

Sie müssen die richtige Codierung und Sortierung für Ihre Tabellen einrichten.

Die Tabellencodierung muss die tatsächliche Datencodierung widerspiegeln. Was ist Ihre Datenkodierung?

Um die Tabellencodierung anzuzeigen, können Sie eine Abfrage ausführen SHOW CREATE TABLE tablename

Ihr gesunder Menschenverstand
quelle
0

Wenn ich Suchanfragen ohne Berücksichtigung von Groß- und Kleinschreibung entwickeln möchte, konvertiere ich immer jede Zeichenfolge in Kleinbuchstaben, bevor ich einen Vergleich durchführe

Rbacarin
quelle
0

Sie können die folgende Methode verwenden

 private function generateStringCondition($value = '',$field = '', $operator = '', $regex = '', $wildcardStart = '', $wildcardEnd = ''){
        if($value != ''){
            $where = " $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd' ";

            $searchArray = explode(' ', $value);

            if(sizeof($searchArray) > 1){

                foreach ($searchArray as $key=>$value){
                    $where .="$operator $field $regex '$wildcardStart".strtolower($value)."$wildcardEnd'";
                }

            }

        }else{
            $where = '';
        }
        return $where;
    }

Verwenden Sie diese Methode wie unten

   $where =  $this->generateStringCondition($yourSearchString,  'LOWER(columnName)','or', 'like',  '%', '%');
  $sql = "select * from table $where";
König Neo
quelle