Comment puis-je rechercher (sans tenir compte de la casse) dans une colonne à l’aide du caractère générique LIKE?

J’ai regardé autour de moi et n’ai pas trouvé ce que j’étais après alors voilà.

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

Cela fonctionne bien, mais pas si l’arbre s’appelle Elm ou ELM etc …

Comment puis-je rendre SQL insensible à la casse pour cette recherche générique?

J’utilise MySQL 5 et Apache.

 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 simplement omettre toutes ces astuces: cela fonctionnera automatiquement.

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

Cela permettra également de reconstruire les index sur cette colonne afin qu’ils puissent être utilisés pour les requêtes sans conduire «%»

J’ai toujours résolu ce problème en utilisant moins:

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

La sensibilité à la casse est définie dans les parameters de classement des colonnes / tables / bases 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 trouvez utile). Le _ci signifie insensible à la casse .

C’est l’exemple d’une simple requête LIKE:

 SELECT * FROM  WHERE  LIKE '%%'

Maintenant, insensible à la casse en utilisant LOWER () func:

 SELECT * FROM  WHERE LOWER() LIKE LOWER('%%')

Je fais quelque chose comme ça.

Obtenir les valeurs en minuscules et MySQL fait le rest

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

Et pour MySQL PDO Alternative:

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

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

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

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

Vous n’avez pas besoin de ALTER une table. Utilisez simplement les requêtes suivantes, avant la requête SELECT que vous souhaitez utiliser avec 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; 

Vous devez configurer le codage et le classement appropriés pour vos tables.

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

Pour voir l’encodage de la table, vous pouvez exécuter une requête SHOW CREATE TABLE tablename

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

bien dans mysql 5.5, comme opérateur est insensible … donc si vale est elm ou ELM ou Elm ou eLM ou 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, par exemple, travaillez comme sensible à la casse, donc si vous tapez “% elm%”, cela ira uniquement pour cela et ignorera les majuscules.

Étrange, mais c’est comme ça 🙂

 SELECT name FROM gallery WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%' GROUP BY name COLLATE utf8_general_ci LIMIT 5