Bonjour,

Uncaught mysqli_sql_exception: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb3_general_ci,COERCIBLE) for operation '='

if (!Empty ($vv[22]))
{
if (isSet ($Fab_Tab[$vv[22]])) $vv[22] = $Fab_Tab[$vv[22]];
 
$requete = "SELECT col_1 FROM table WHERE col_2 = '" . $vv[22] . "'";
 
if (mysqli_num_rows (mysqli_query ($connexion, $requete)) == 0) $Tab_Equi[$vv[0]] = $vv[22];
}


col_1 = INT
col_2 = varchar(40) INTERCLASSEMENT utf8mb4_unicode_ci
$vv[22] = provient d'un fichier externe, codage inconnu (peut-être utf8mb3_general_ci,COERCIBLE).

Je ne comprends pas l'erreur.
Je suppose qu'il faut ajouter un COLLATE quelque part mais où ?

Merci d'avance de votre aide.
Salut,

sans certitude vu que je fais pas ça tous les 4 matins Smiley sweatdrop , mais il me semble que lorsque tu rajoutes un collate dans un select c'est pour changer momentanément le type des données, donc je dirais que tu dois pouvoir faire
$requete = "SELECT col_1 FROM table WHERE col_2 = '" . $vv[22] . "' COLLATE utf8mb3_general_ci";

Mais il me semble que le problème avec ça c'est que tu perds le bénéfice des indexes Smiley ohwell

Je partirais sur l'idée inverse et de plutôt transformer ta variable php pour que la requête fonctionne correctement (et avec indexe si nécessaire).
Je suppose que ça doit donner un truc du genre :

$vv[22] = mb_convert_encoding($vv[22], "utf8mb4_unicode_ci");

Edit : petit lien vers la doc php : https://www.php.net/manual/fr/function.mb-convert-encoding.php
Modifié par Mathieuu (11 Feb 2025 - 08:57)
Bonjour Mathieuu,

Merci de ton suivi.

J'en suis arrivé aux mêmes conclusions avec une solution un peu différente mais qui fonctionne.

mysqli_set_charset ($connexion, 'utf8mb4');


Cela ne suffit pas, je me suis donc attaqué à la variable $vv[22] sur laquelle je n'ai aucun contrôle a priori car envoyée par un fournisseur.
C'est supposé être une référence fabricant, une suite de chiffres et de lettres assez courte.
Mais parfois dans le fichier à la place de la référence fabricant il y a le descriptif avec plein de caractères accentués et autre pétouilles qui provoquent une erreur fatale.

$vv[22] = htmlentities ($vv[22], ENT_QUOTES, 'UTF-8' );
 
// Bonne valeur
SELECT col_1 FROM table WHERE col_2 = '060018'
 
// Mauvaise valeur mais ne provoque plus d'erreur fatale
SELECT col_1 FROM table WHERE col_2 = ' 1080p@60m (Cat 5e/6) / 70 m (Cat 6a) 4096 x 2160 / 3840 x 2160 @ 60Hz (4:2:0)'


À noter que je n'ai rien à changer dans ma base.