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.
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 '%'
J'ai toujours résolu ça en utilisant plus bas:
SELECT * FROM trees WHERE LOWER( trees.title ) LIKE '%Elm%'
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 .
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>%')
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
Je pense que cette requête fera une recherche insensible à la casse:
SELECT * FROM trees WHERE trees.`title` ILIKE '%Elm%';
SELECT name
FROM gallery
WHERE CONVERT(name USING utf8) LIKE _utf8 '%$q%'
GROUP BY name COLLATE utf8_general_ci LIMIT 5
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 :)
Lorsque je souhaite développer des recherches de cas insensibles, je convertis toujours chaque chaîne en minuscule avant la comparaison.
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
utiliser ILIKE
SELECT * FROM trees WHERE trees.`title` ILIKE '%Elm%';
ça a fonctionné pour moi !!
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;