HOWTO · MySQL
Vérifiez si la chaîne contient certaines données dans MySQL
Ce tutoriel montre comment vérifier si une chaîne contient certaines données ou une sous-chaîne dans une table MySQL.
Sur cette page
Pour trouver dans MySQL les lignes dont le texte contient une sous-chaîne, filtrez les résultats avec WHERE LOCATE('widget', product_name) > 0, WHERE INSTR(product_name, 'widget') > 0 ou WHERE product_name LIKE '%widget%'. LOCATE() et INSTR() recherchent une sous-chaîne littérale ; LIKE convient lorsque la recherche nécessite des caractères génériques. Les exemples ci-dessous utilisent la même petite table products pour vous aider à choisir la forme adaptée à votre requête.
Préparer une table d’exemple pour rechercher des sous-chaînes
Créez une table contenant un identifiant et un nom de produit, puis ajoutez quelques lignes avec et sans le terme recherché. Dans une session MySQL, vous pouvez créer la table avec CREATE TABLE products (product_id INT PRIMARY KEY, product_name VARCHAR(255));, puis la remplir avec INSERT INTO products (product_id, product_name) VALUES (1, 'Gadget Widget'), (2, 'Electronic Widget'), (3, 'Toy Widget'), (4, 'Tool Set');.
Ce jeu de données contient trois noms avec Widget et un nom sans ce terme. Les requêtes suivantes sélectionnent les trois premières lignes. Les extraits SQL sont destinés à être exécutés dans MySQL ; aucune preuve d’exécution sur un service MySQL n’étant fournie pour cette tâche, les résultats sont décrits et ne sont pas présentés comme la sortie observée d’une commande MySQL. Dans votre base de données, exécutez une fois la définition et le remplissage de la table avant d’essayer les recherches. Si une table appelée products existe déjà, choisissez un autre nom ou adaptez l’exemple à votre schéma.
Cette vérification Python locale reproduit les correspondances attendues pour l’exemple ; elle n’exécute pas MySQL. Elle affiche les noms de produits contenant Widget.
products = [
(1, "Gadget Widget"),
(2, "Electronic Widget"),
(3, "Toy Widget"),
(4, "Tool Set"),
]
for product_id, product_name in products:
if "Widget" in product_name:
print(product_id, product_name)
1 Gadget Widget
2 Electronic Widget
3 Toy Widget
Rechercher une sous-chaîne avec LOCATE() et INSTR()
Utilisez LOCATE() en plaçant le terme recherché en premier argument et la valeur de la colonne en second : LOCATE(substring, string). La fonction renvoie la position de la première occurrence, en commençant à 1, ou 0 si aucune occurrence n’est trouvée. Dans une condition WHERE, comparer le résultat à > 0 ne conserve que les lignes contenant la sous-chaîne. Pour cette table, la requête est SELECT product_id, product_name FROM products WHERE LOCATE('Widget', product_name) > 0;. Elle correspond aux identifiants 1, 2 et 3.
INSTR() teste les mêmes valeurs, mais inverse l’ordre des arguments : INSTR(string, substring). Elle renvoie également la position de la première occurrence, ou 0 si la sous-chaîne est absente. La requête équivalente est SELECT product_id, product_name FROM products WHERE INSTR(product_name, 'Widget') > 0;. Elle renvoie les mêmes trois lignes. Pour passer d’une fonction à l’autre, retenez surtout l’ordre de leurs arguments.
Les deux fonctions recherchent la sous-chaîne fournie dans la valeur de la colonne. Elles sont utiles lorsque vous disposez déjà du terme littéral à rechercher. Leur résultat est une position, pas une ligne ; la condition WHERE transforme cette valeur numérique en filtre de lignes. Remplacez * par les seules colonnes dont votre application a besoin afin d’obtenir un résultat plus facile à exploiter.
La sensibilité à la casse dépend de la collation utilisée par la colonne ou l’expression. Les requêtes de l’exemple utilisent Widget, avec la même casse que les valeurs du jeu de données. Si les résultats diffèrent de vos attentes concernant la casse, vérifiez la collation de votre colonne ; ne supposez pas que toutes les comparaisons MySQL se comportent de la même manière.
Rechercher des sous-chaînes et des motifs avec LIKE
L’opérateur LIKE compare la valeur d’une colonne à un motif. Sans caractère générique, la comparaison porte sur la valeur entière : product_name LIKE 'Widget' recherche une valeur correspondant à Widget, au lieu de chercher ces lettres n’importe où dans un nom plus long. Pour trouver le terme où qu’il se trouve dans la valeur, ajoutez % de chaque côté : SELECT product_id, product_name FROM products WHERE product_name LIKE '%Widget%';. Dans la table d’exemple, ce motif contenant le terme correspond aux identifiants 1, 2 et 3.
Le caractère générique % représente zéro caractère ou davantage. Placez-le avant un terme pour trouver les valeurs qui se terminent par celui-ci, comme avec product_name LIKE '%Widget' ; placez-le après le terme pour trouver les valeurs qui commencent par celui-ci, comme avec product_name LIKE 'Toy%'. Encadrez le terme de % pour autoriser des caractères avant et après. Ces placements permettent d’indiquer où le texte recherché doit apparaître sans préciser les caractères qui l’entourent.
Le caractère générique _ représente exactement un caractère. Par exemple, product_name LIKE 'Gadget_Widget' correspond à une valeur composée de Gadget, puis d’un caractère, puis de Widget ; dans ce jeu de données, il correspond à Gadget Widget, où le caractère intermédiaire est une espace. % et _ ont des rôles différents : le premier autorise une séquence de longueur quelconque, tandis que le second autorise un seul caractère à cette position.
Choisissez LIKE lorsqu’un motif exprime la recherche souhaitée, et utilisez LOCATE() ou INSTR() pour vérifier directement la présence d’une sous-chaîne. Pour rechercher littéralement des caractères % ou _, échappez-les selon les règles d’échappement de LIKE dans MySQL au lieu de les laisser agir comme des caractères génériques. Ces prédicats filtrent des lignes ; ils ne valident pas les entrées utilisateur. Si le terme de recherche vient d’un utilisateur, transmettez-le comme paramètre via votre client de base de données et suivez les recommandations de ce client pour la liaison des paramètres.