web-dev-qa-db-fra.com

Mélange illégal d'erreur de classements dans MySql

Je viens de recevoir cette réponse d'une question précédente et ça marche un régal!

SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount 
FROM ratings WHERE month='Aug' GROUP BY username HAVING TheCount > 4
ORDER BY TheAverage DESC, TheCount DESC

Mais quand j'insère ce petit extra, cela donne cette erreur:

Documentation # 1267 - Mélange illégal de des collations (latin1_swedish_ci, IMPLICIT) et (latin1_general_ci, IMPLICIT) pour opération '='

SELECT username, (SUM(rating)/COUNT(*)) as TheAverage, Count(*) as TheCount FROM 
ratings WHERE month='Aug' 
**AND username IN (SELECT username FROM users WHERE gender =1)**
GROUP BY username HAVING TheCount > 4 ORDER BY TheAverage DESC, TheCount DESC

Le tableau est:

id, username, rating, month

38
Oliver

Vérifiez le type de classement de chaque table et assurez-vous qu'ils ont le même classement.

Après cela, vérifiez également le type de classement de chaque champ de table que vous avez utilisé en opération.

J'avais rencontré la même erreur, et cette astuce marche pour moi.

14
1mr3yn

Voici comment vérifier quelles colonnes sont le mauvais classement:

SELECT table_schema, table_name, column_name, character_set_name, collation_name

FROM information_schema.columns

WHERE collation_name = 'latin1_general_ci'

ORDER BY table_schema, table_name,ordinal_position; 

Et voici la requête pour y remédier:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin1 COLLATE 'latin1_swedish_ci';

Lien

72
Dean Rather

[MySQL]

Dans ces cas (très rares):

  • deux tables qui ont vraiment besoin de types de collation différents
  • valeurs ne provenant pas d'une table, mais d'une énumération explicite, par exemple:

    SELECT 1 numéros AS UNION ALL SELECT 2 UNION ALL SELECT 3

vous pouvez comparer les valeurs entre les différentes tables en utilisant CAST ou CONVERT:

CAST('my text' AS CHAR CHARACTER SET utf8)

CONVERT('my text' USING utf8)

Voir Documentation CONVERT et CAST sur le site Web de MySQL.

11
RotS

Je recevais cette même erreur sur PhpMyadmin et ai fait la solution indiquée ici qui a fonctionné pour moi

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Mélange illégal de classements Erreur MySQL Je vous recommanderais également d’utiliser General au lieu de suédois, car celui-ci est défini par défaut et vous ne devez pas utiliser la langue si votre application n’utilise pas le suédois.

5
pal4life
  • Vérifiez que votre colonne users.gender est un INTEGER.
  • Essayez: alter table users convert to character set latin1 collate latin1_swedish_ci;
1
hobodave

J'ai eu la même erreur à l'intérieur d'une procédure stockée, dans la clause where. J'ai découvert que le problème se posait avec une variable déclarée locale, chargée auparavant par la même table/colonne.

Je l'ai résolu en convertissant les données en type de caractère unique.

1
Roberto Camargo

Le problème ici principalement, juste Cast le champ comme ceci cast (field as varchar) ou cast (champs as date)

1
reds

Je pense que vous devriez convertir en utf8

--set utf8 for connection
SET collation_connection = 'utf8_general_ci'
--change CHARACTER SET of DB to utf8
ALTER DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci
--change CHARACTER SET of table to utf8
ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
1
Quy Le

En bref, cette erreur est causée par MySQL qui tente d’effectuer une opération sur deux choses ayant des paramètres de classement différents. Si vous faites correspondre les paramètres, l'erreur disparaîtra. Bien sûr, vous devez choisir le bon réglage pour votre base de données, en fonction de l'utilisation qui va en être faite. 

Voici quelques conseils utiles pour choisir entre deux classements très courants utf8: Quelle est la différence entre utf8_general_ci et utf8_unicode_ci

Si vous utilisez phpMyAdmin, vous pouvez le faire systématiquement en parcourant les tables mentionnées dans votre message d'erreur et en vérifiant le type de classement de chaque colonne. Tout d’abord, vous devriez vérifier quel est le paramètre de classement général de votre base de données - phpMyAdmin peut vous le dire et le modifier si nécessaire. Mais chaque colonne de chaque table peut avoir son propre paramètre. Normalement, vous voudrez que tout cela corresponde. 

Dans une petite base de données, cela est assez facile à faire à la main et, dans tous les cas, si vous lisez le message d'erreur dans son intégralité, vous serez généralement dirigé au bon endroit. N'oubliez pas de consulter également les paramètres de structure pour les colonnes contenant des sous-tables. Lorsque vous trouvez un classement qui ne correspond pas, vous pouvez le modifier directement à l'aide de phpMyAdmin, inutile d'utiliser la fenêtre de requête. Ensuite, essayez à nouveau votre opération. Si l'erreur persiste, continuez à chercher!

1
Pinkeye

Vous devez changer chaque colonne Collation de latin1_general_ci en latin1_swedish_ci

1
Swadesh

J'ai également eu la même erreur, mais dans mon cas le problème principal était dansconditionne le paramètre que je vérifie avait un caractère caché inconnu ( +% A0 )

QuandA0convert j'ai eu 160 mais 160 était en dehors du caractère que db connaît, c'est pourquoi la base de données ne peut pas le reconnaître en tant que caractère 

  • la solution que j'ai faite a été j'ai vérifié il y a des caractères comme ça et les supprimer avant d'exécuter la commande sql 

  • ex: - preg_replace ('/\D /', '', $ myParameter);

1
kaushi

Utilisez ascii_bin dans la mesure du possible, il correspondra à presque tous les collations . Un nom d'utilisateur accepte rarement les caractères spéciaux.

0
Kjeld Flarup

J'ai le même problème avec l'avertissement de collection pour un champ défini entre 0 et 1. Toutes les collections de colonnes étaient identiques. Nous essayons de modifier les collections encore mais rien ne résout ce problème.

À la fin, nous mettons à jour le champ avec la variable NULL. Après cela, nous mettons à jour la valeur à 1 et le problème de collecte est résolu.

0
glg
SELECT  username, AVG(rating) as TheAverage, COUNT(*) as TheCount
FROM    ratings
        WHERE month='Aug'
        AND username COLLATE latin1_general_ci IN
        (
        SELECT  username
        FROM    users
        WHERE   gender = 1
        )
GROUP BY
        username
HAVING
        TheCount > 4
ORDER BY
        TheAverage DESC, TheCount DESC;
0
Quassnoi

Vous devez définir 'utf8' pour tous les paramètres de chaque fonction. C'est mon cas:

entrez la description de l'image ici

0
Nhung Phan

Si vous voulez éviter de changer de syntaxe pour résoudre ce problème, essayez ceci:

Mettez à jour votre MySQL vers la version 5.5 ou supérieure.

Cela a résolu le problème pour moi.

0
HoldOffHunger