Je reçois cette erreur étrange lors du traitement d'un grand nombre de données ...
Error Number: 1267
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'
Que puis-je faire pour résoudre ce problème? Puis-je échapper à la chaîne d'une manière ou d'une autre pour que cette erreur ne se produise pas ou dois-je modifier le codage de ma table d'une manière ou d'une autre, et si oui, à quoi devrais-je la changer?
SET collation_connection = 'utf8_general_ci';
alors pour vos bases de données
ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
MySQL s'y introduit en suédois parfois sans raison valable.
Vous devez définir à la fois le codage de votre table et celui de la connexion sur UTF-8
:
ALTER TABLE keywords CHARACTER SET UTF8; -- run once
et
SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';
CONVERT(column1 USING utf8)
Résout mon problème. Où column1 est la colonne qui me donne cette erreur.
Utilisez l'instruction suivante pour l'erreur
faites attention si vos données sont sauvegardées si elles ont une table.
ALTER TABLE nom_table_votre CONVERT TO SET DE CARACTERES utf8 COLLATE utf8_general_ci;
Changer le jeu de caractères de la table en utf8
ALTER TABLE nom_table_votre CONVERT TO SET DE CARACTERES utf8
Après avoir apporté les corrections répertoriées dans la réponse en haut, modifiez les paramètres par défaut de votre serveur.
Dans votre "/etc/my.cnf.d/server.cnf" ou, où que ce soit, ajoutez les valeurs par défaut à la section [mysqld] afin que cela ressemble à ceci:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
Source: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
J'ai fait créer ma table avec CHARSET = latin1 . Après la conversion de la table en utf8 , certaines colonnes n’ont pas été converties, mais ce n’était pas vraiment évident. Vous pouvez essayer d'exécuter SHOW CREATE TABLE my_table;
et voir quelle colonne n'a pas été convertie ou tout simplement corriger le jeu de caractères incorrect sur la colonne problématique avec la requête ci-dessous (changez varchar length et CHARSET et COLLATE selon vos besoins):
ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8
COLLATE utf8_general_ci NULL;
En général, la meilleure méthode consiste à modifier le classement de la table. Cependant, j'ai une vieille application et je ne suis pas vraiment en mesure d'estimer le résultat si cela a des effets secondaires. Par conséquent, j’ai essayé en quelque sorte de convertir la chaîne en un autre format permettant de résoudre le problème de classement . Ce que j’ai trouvé à travailler, c’est de comparer les chaînes en convertissant les chaînes en une représentation hexadécimale de ses caractères. Sur la base de données, cela se fait avec HEX(column).
. Pour PHP, vous pouvez utiliser cette fonction:
public static function strToHex($string)
{
$hex = '';
for ($i=0; $i<strlen($string); $i++){
$ord = ord($string[$i]);
$hexCode = dechex($ord);
$hex .= substr('0'.$hexCode, -2);
}
return strToUpper($hex);
}
Lors de l'interrogation de la base de données, votre chaîne UTF8 d'origine doit d'abord être convertie en chaîne iso (par exemple, à l'aide de utf8_decode()
en PHP) avant de pouvoir être utilisée dans la base de données. En raison du type de classement, la base de données ne peut pas contenir de caractères UTF8; le comparisme doit donc fonctionner si la chaîne d'origine est modifiée (la conversion des caractères UTF8 qui n'existent pas dans le jeu de caractères ISO donne un? Ou est entièrement supprimée). Assurez-vous simplement que lorsque vous écrivez des données dans la base de données, vous utilisez la même conversion UTF8 en ISO.