J'obtiens cette étrange erreur 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 changer le codage de ma table d'une manière ou d'une autre, et si oui, comment dois-je le changer?
mysql
sql
mysql-error-1267
Cliquez sur Upvote
la source
la source
Réponses:
puis pour vos bases de données
MySQL se faufile parfois en suédois sans raison valable.
la source
Vous devez définir à la fois le codage de votre table et celui de la connexion sur
UTF-8
:et
la source
myDb
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Cela fonctionnerait-il? Ceci est fait pour que cela affecte toutes mes tables, pas seulement l'une d'entre ellesRésout mon problème. Où colonne1 est la colonne qui me donne cette erreur.
la source
Utilisez l'instruction suivante pour l'erreur
faites attention à vos données, prenez une sauvegarde si les données sont dans le tableau.
la source
En général, le meilleur moyen est de modifier le classement des tables. Cependant, j'ai une ancienne 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é d'une manière ou d'une autre de convertir la chaîne dans un autre format qui a résolu le problème de classement. Ce que j'ai trouvé efficace, 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:Lorsque vous effectuez la requête de base de données, votre chaîne UTF8 d'origine doit d'abord être convertie en une chaîne iso (par exemple en utilisant
utf8_decode()
en PHP) avant de l'utiliser 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 devrait donc fonctionner même si cela modifie la chaîne d'origine (la conversion des caractères UTF8 qui n'existent pas dans le jeu de caractères ISO entraîne un? Ou ceux-ci sont entièrement supprimés). 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.la source
J'ai créé ma table à l'origine avec CHARSET = latin1 . Après la conversion de 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 simplement corriger le jeu de caractères incorrect sur la colonne problématique avec la requête ci-dessous (modifiez la longueur de varchar et CHARSET et COLLATE selon vos besoins):la source
Changer le jeu de caractères de la table en utf8
la source
Après avoir effectué vos corrections répertoriées dans la première réponse, modifiez les paramètres par défaut de votre serveur.
Dans votre " /etc/my.cnf.d/server.cnf " ou où qu'il se trouve, ajoutez les valeurs par défaut à la section [mysqld] pour qu'elle ressemble à ceci:
Source: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
la source
J'ai trouvé que l'utilisation
cast()
était la meilleure solution pour moi:Il y a aussi une
convert()
fonction. Plus de détails iciUne autre ressource ici
la source
Mon compte utilisateur n'avait pas les autorisations pour modifier la base de données et la table, comme suggéré dans cette solution .
Si, comme moi, vous ne vous souciez pas du classement des caractères (vous utilisez l'opérateur '='), vous pouvez appliquer le correctif inverse. Exécutez ceci avant votre SELECT:
la source