8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je cherche Ã, pas a ni A.

Il faut une requête sensible à la casse et aux accents.

J'essaye dans phpMyAdmnin :

SELECT * FROM `mf2pqcm_posts` WHERE `post_text` LIKE '%Ã%' COLLATE utf8mb4_cs_as;


MySQL répond :

Unknown collation: 'utf8mb4_cs_as'

J'ai aussi essayé :

SELECT * FROM `mf2pqcm_posts` WHERE `post_text` LIKE '%Ã%' COLLATE latin1_general_cs;


COLLATION 'latin1_general_cs' is not valid for CHARACTER SET 'utf8mb4'

Je crois savoir que COLLATE est mon ami mais en dépit d'une recherche assez poussée sur le Web je n'ai pas trouvé la bonne syntaxe.

Pouvez-vous m'aider ?

Merci d'avance.
Salut,
La collation `utf8mb4_cs_as` utilisée n'existe pas dans MySQL... (édit) ni même dans une autre BDD a priori. Au cas où voici quelques collations classiques : `utf8mb4_general_ci` ou `utf8mb4_unicode_ci`.

Mais sont-elles obligatoires ? Moi je suis sous Postgres et, sur cette BDD, un LIKE est sensible à la case et aux accents par défaut. C'est l'inverse en fait : il faut spécifier lorsque l'on ne veut pas que cela soit le cas. Je n'ai pas vérifié mais je pense que sous MySQL ce doit être le même comportement.

Sinon, à terme LIKE c'est bien pour prototyper, mais c'est coûteux et il y a bien mieux, même sous MySQL. Pour ce dernier : le NATURAL LANGUAGE MODE.
Modifié par Olivier C (20 Apr 2024 - 22:16)
Bonjour Olivier C,

Merci de ton suivi.

Sous MySQL cela dépend du codage du champ dans la base (interclassement de mémoire).

Si interclassement = insensible à la casse et que tu dois faire une recherche sensible, soit tu changes l'interclassement soit tu ajoutes un COLLATE dans la requête.

Si utf8mb4_general_ci existe je suppose que utf8mb4_general_cs existe aussi et je vais essayer demain.

Autrement je connais et utilise la recherche en texte naturel mais elle ne peut pas remplacer tous les LIKE il me semble.
Modifié par boteha_2 (20 Apr 2024 - 22:31)
boteha_2 a écrit :
Si utf8mb4_general_ci existe je suppose que utf8mb4_general_cs existe aussi et je vais essayer demain.

Pas sûr si j'en crois les forums, mais je ne suis tombé que sur de très vieux messages...
Pour obtenir la liste des collations en "_cs" sous MySQL :
SHOW COLLATION WHERE COLLATION LIKE "%_cs";

Modifié par Olivier C (20 Apr 2024 - 22:52)
Bonjour,

SHOW COLLATION WHERE COLLATION LIKE "%_cs";


Effectivement, cela renvoie une bonne trentaine de valeurs.

J'ai choisi : utf8mb4_0900_as_cs
Sensible aux accents et à la casse.

SELECT * FROM mf2pqcm_posts WHERE post_text LIKE '%Ã %' COLLATE utf8mb4_0900_as_cs;


Certains auront compris que mon problème est de réparer des tables dont les caractères accentués ont été massacrés lors d'un changement de version SQL (passage à 8.0 chez OVH).

è est remplacé par é, ê par ê, etc.

à est remplacé par "à", très vicieux car l'espace blanc derrière à ne correspond pas à un espace normal sur le clavier.
C'est un espace insécable NBSP

Pour être prudent :

UPDATE mf2pqcm_posts SET post_text = REPLACE(post_text , 'à' , 'à') WHERE `post_text` LIKE '%à*%' COLLATE utf8mb4_0900_as_cs;


J'attends un peu avant de cocher Résolu.
Modifié par boteha_2 (21 Apr 2024 - 13:17)
Bonjour,

Accessoirement REPLACE est sensible à la casse et aussi aux accents.

SELECT REPLACE('Aaà', 'a', 'b');


retourne : Abà

Donc le COLLATE n'est pas nécessaire dans le REPLACE, dans le SELECT uniquement.

Je coche Résolu.
Modifié par boteha_2 (22 Apr 2024 - 21:15)