web-dev-qa-db-fra.com

Mélange illégal de collations Erreur MySQL

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?

104
Click Upvote
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.

247
Ben Hughes

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';
12
Quassnoi
CONVERT(column1 USING utf8)

Résout mon problème. Où column1 est la colonne qui me donne cette erreur.

7
Binaya Shrestha

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;
2
vpgodara

Changer le jeu de caractères de la table en utf8

ALTER TABLE nom_table_votre CONVERT TO SET DE CARACTERES utf8

0
Jamsheer Mohammed

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

0
ITI

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;
0
A Kunin

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.

0
Stephan