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
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.
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';
[MySQL]
Dans ces cas (très rares):
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.
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.
alter table users convert to character set latin1 collate latin1_swedish_ci;
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.
Le problème ici principalement, juste Cast le champ comme ceci cast (field as varchar) ou cast (champs as date)
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
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!
Vous devez changer chaque colonne Collation de latin1_general_ci en latin1_swedish_ci
J'ai également eu la même erreur, mais dans mon cas le problème principal était dans où conditionne 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);
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.
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.
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;
Vous devez définir 'utf8' pour tous les paramètres de chaque fonction. C'est mon cas:
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.