Miscelazione illegale di errori di confronto in MySql

Ho appena ricevuto questa risposta da una domanda precedente e funziona benissimo!

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 

Ma quando inserisco questo bit in più, viene visualizzato questo errore:

Documentazione n. 1267 – Illegale mix di regole di confronto (latin1_swedish_ci, IMPLICIT) e (latin1_general_ci, IMPLICIT) per l’operazione ‘=’

 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 

Il tavolo è:

id, username, rating, month

    Controlla il tipo di confronto di ogni tabella e assicurati che abbiano le stesse regole di confronto.

    Dopo questo controllo, anche il tipo di confronto di ogni campo di tabella che hai utilizzato in funzione.

    Avevo incontrato lo stesso errore e quel trucco funziona su di me.

    Ecco come controllare quali colonne sono le regole di confronto errate:

     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; 

    Ed ecco la query per risolverlo:

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

    collegamento

    [MySQL]

    In questi casi (molto rari):

    • due tabelle che richiedono davvero tipi di confronto diversi
    • valori non provenienti da una tabella, ma da un’enumerazione esplicita, ad esempio:

      SELEZIONA 1 numeri AS UNIONE TUTTI SELEZIONA 2 UNIONE TUTTI SELEZIONA 3

    puoi confrontare i valori tra le diverse tabelle usando CAST o CONVERT:

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

    Vedi la documentazione CONVERT e CAST sul sito web MySQL.

    Stavo ricevendo lo stesso errore su PhpMyadmin e ho fatto la soluzione indicata qui che funzionava per me

     ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

    Miscela illegale di conflitti Errore MySQL Raccomanderei anche di andare con Generale invece di svedese poiché quello è predefinito e non usare la lingua a meno che l’applicazione non usi lo svedese.

    • Verifica che la colonna users.gender sia INTEGER.
    • Prova: alter table users convert to character set latin1 collate latin1_swedish_ci;

    Devi modificare ogni colonna Collation da latin1_general_ci a latin1_swedish_ci

    Ho ottenuto questo stesso errore all’interno di una stored procedure, nella clausola where. ho scoperto che il problema si presentava con una variabile dichiarata locale, precedentemente caricata dalla stessa tabella / colonna.

    Ho deciso di trasmettere i dati a un singolo tipo di carattere.

    In breve, questo errore è causato da MySQL che tenta di eseguire un’operazione su due cose che hanno impostazioni di confronto diverse. Se fai corrispondere le impostazioni, l’errore andrà via. Naturalmente, è necessario scegliere l’impostazione giusta per il proprio database, a seconda di cosa verrà utilizzato.

    Ecco alcuni buoni consigli per scegliere tra due collazioni utf8 molto comuni: qual è la differenza tra utf8_general_ci e utf8_unicode_ci

    Se stai usando phpMyAdmin puoi farlo sistematicamente lavorando attraverso le tabelle menzionate nel tuo messaggio di errore e controllando il tipo di confronto per ogni colonna. Per prima cosa dovresti controllare qual è l’impostazione generale delle regole di confronto per il tuo database – phpMyAdmin può dirti questo e cambiarlo se necessario. Ma ogni colonna in ogni tabella può avere le proprie impostazioni. Normalmente vorrai che tutti questi corrispondano.

    In un piccolo database questo è abbastanza facile da fare a mano, e in ogni caso se si legge il messaggio di errore in modo completo di solito ti indirizzerà al posto giusto. Non dimenticare di guardare anche le impostazioni della “struttura” per le colonne con sottotabella. Quando trovi una collation che non corrisponde puoi cambiarla usando phpMyAdmin direttamente, non è necessario usare la finestra di query. Quindi prova di nuovo l’operazione. Se l’errore persiste, continua a cercare!

    Penso che dovresti convertire in 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 

    Il problema qui principalmente, basta lanciare il campo come questo cast (campo come varchar) o cast (campi come data)

     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; 

    Usa ascii_bin dove mai ansible, si abbinerà a quasi tutte le regole di confronto. Un nome utente raramente accetta caratteri speciali comunque.

    Se vuoi evitare di modificare la syntax per risolvere questo problema, prova questo:

    Aggiorna il tuo MySQL alla versione 5.5 o successiva.

    Questo ha risolto il problema per me.

    Ho lo stesso problema con l’avviso di raccolta per un campo impostato da 0 a 1. Tutte le raccolte di colonne erano uguali. Proviamo a cambiare nuovamente le raccolte ma nulla risolve questo problema.

    Alla fine aggiorniamo il campo su NULL e dopo questo aggiorniamo 1 e questo risolve il problema di raccolta.

     HAvING TheCount > 4 AND username IN (SELECT username FROM users WHERE gender=1) 

    ma perché sto rispondendo, non mi hai votato come risposta giusta 🙂

    Assicurati che la tua versione di MySQL supporti le sottoquery (4.1+). Successivamente, potresti provare a riscrivere la tua query con qualcosa del genere:

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