web-dev-qa-db-fra.com

Comment puis-je effectuer une recherche (insensible à la casse) dans une colonne à l'aide du caractère générique LIKE?

J'ai regardé autour de moi et je n'ai pas trouvé ce que je recherchais, alors voilà.

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

Cela fonctionne bien, mais pas si l'arbre est nommé Elm ou Elm, etc.

Comment rendre SQL insensible à la casse pour cette recherche avec caractères génériques?

J'utilise MySQL 5 et Apache.

224
David Morrow
SELECT  *
FROM    trees
WHERE   trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%Elm%'

En fait, si vous ajoutez COLLATE UTF8_GENERAL_CI à la définition de votre colonne, vous pouvez omettre toutes ces astuces: cela fonctionnera automatiquement. 

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

Cela reconstruira également tous les index de cette colonne afin qu'ils puissent être utilisés pour les requêtes sans indiquer '%'

224
Quassnoi

J'ai toujours résolu ça en utilisant plus bas:

SELECT * FROM trees WHERE LOWER( trees.title ) LIKE  '%Elm%'
198
cwallenpoole

La sensibilité à la casse est définie dans les paramètres de classement colonnes/tables/base de données. Vous pouvez effectuer la requête sous un classement spécifique de la manière suivante:

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

par exemple.

(Remplacez utf8_general_ci par le classement que vous jugez utile). Le _ci signifie insensible à la casse .

44
aioobe

Voici l'exemple d'une requête simple LIKE:

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

Maintenant, insensible à la casse avec LOWER () func:

SELECT * FROM <table> WHERE LOWER(<key>) LIKE LOWER('%<searchpattern>%')
35
Federico Piragua

Je fais quelque chose comme ça.

Obtenir les valeurs en minuscule et MySQL fait le reste

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

Et pour l’alternative MySQL PDO:

        $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();

Utilisez simplement:

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

Ou utiliser

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

Les deux fonctions fonctionnent de la même manière

13
Vi8L

Je pense que cette requête fera une recherche insensible à la casse:

SELECT * FROM trees WHERE trees.`title` ILIKE '%Elm%';
7
cgupta
SELECT name 
       FROM gallery 
       WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' 
       GROUP BY name COLLATE utf8_general_ci LIMIT 5 
1
user4189641

bien dans mysql 5.5, comme l'opérateur est insensible ... donc si votre vale est Elm ou Elm ou Elm ou tout autre, et que vous utilisez comme '% Elm%', il listera toutes les valeurs correspondantes.

Je ne peux pas dire à propos des versions précédentes de MySQL.

Si vous allez dans Oracle, travaillez comme sensible à la casse, donc si vous tapez comme '% Elm%', il n'acceptera que cela et ignorera les majuscules.

Etrange, mais c'est comme ça :)

0
user21546

Lorsque je souhaite développer des recherches de cas insensibles, je convertis toujours chaque chaîne en minuscule avant la comparaison.

0
Rbacarin

Vous devez configurer un encodage et un classement corrects pour vos tables.

Le codage de table doit refléter le codage réel des données. Quel est votre encodage de données? 

Pour voir le codage de table, vous pouvez exécuter une requête SHOW CREATE TABLE tablename

0

utiliser ILIKE

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

ça a fonctionné pour moi !!

0
ABS zarzis

Vous n'avez pas besoin de ALTER aucune table. Utilisez simplement les requêtes suivantes, avant la requête SELECT, pour lesquelles vous souhaitez utiliser le caractère générique:

    set names `utf8`;
    SET COLLATION_CONNECTION=utf8_general_ci;
    SET CHARACTER_SET_CLIENT=utf8;
    SET CHARACTER_SET_RESULTS=utf8;
0
Lopofsky