Franco: #1267 - Illegal mix of collations

Hi,

bei einem Join erhalte ich folgende Fehlermeldung:

#1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

Eigentlich war ich der Meinung, alles auf Standarteinstellung gelassen zu haben, nur wo kommt dann utf8 her?

Wie geht man in so einem Fall vor,vor allem ohne Daten zu kontaminieren oder gar zu verlieren?

Gruß, Frank

  1. Hallo,

    bei einem Join erhalte ich folgende Fehlermeldung:

    #1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

    schau' Dir bitte die CREATE-TABLE-Statements der beiden Tabellen (falls es zwei sind) an, die Du joinen willst. Stelle uns bitte außerdem den relevanten Ausschnitt aus Deinem Statement zur Verfügung.

    Danach kann man weitersehen.

    Freundliche Grüße

    Vinzenz

    1. Hi Vinzenz,

      schau' Dir bitte die CREATE-TABLE-Statements der beiden Tabellen (falls es zwei sind) an, die Du joinen willst. Stelle uns bitte außerdem den relevanten Ausschnitt aus Deinem Statement zur Verfügung.

      Wenn ich aus phpmyadmin exportiere, sehen beide Tabellen so aus:

      CREATE TABLE A...
      ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

      CREATE TABLE B...
      ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

      Der relevante mysql-Teil sieht so aus:

        
      SELECT t.Monat, s.COUNT as count  
      from praefix_tmp t  
      LEFT JOIN  
      (  
      SELECT FROM_UNIXTIME(r.Timestamp, '%Y%|%m') AS ym,  
      sum(b.Menge*b.Preis*  
      (CASE  
      WHEN b.multi = 'ja' THEN 1  
      WHEN b.multi = '100' THEN 1  
      WHEN b.multi = '200' THEN 2.00  
      WHEN ISNULL(b.multi) THEN 1  
      END) ) AS count  
      FROM praefix_A b  
      JOIN praefix_B r  
      ON b.G_ID = r.G_ID  
      WHERE  
      loesch != 1  
      FROM_UNIXTIME(r.Timestamp) > NOW() - INTERVAL 1 YEAR  
      GROUP BY ym DESC  
      ) s  
      ON t.Monat = s.ym  
      ORDER BY t.Monat DESC  
      
      

      Die 3. involvierte Tabelle ist die temporäre tmp-Tabelle, die folgendes CREATE TABLE Statement hat:

      CREATE TEMPORARY TABLE tmp (
        ID int(10),
        Monat varchar(10) NOT NULL
      );

      Danach kann man weitersehen.

      Freut mich. Ich hoffe, die Angaben helfen.

      Grüße, Frank

      1. Hallo Frank,

        schau' Dir bitte die CREATE-TABLE-Statements der beiden Tabellen (falls es zwei sind) an, die Du joinen willst. Stelle uns bitte außerdem den relevanten Ausschnitt aus Deinem Statement zur Verfügung.

        CREATE TABLE A...
        ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

        CREATE TABLE B...
        ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

        Du hast leider den relevanten Teil ausgelassen: die Spaltendefinitionen.

        Der relevante mysql-Teil sieht so aus:

        SELECT t.Monat, s.COUNT as count
        from praefix_tmp t
        LEFT JOIN
        (
        SELECT FROM_UNIXTIME(r.Timestamp, '%Y%|%m') AS ym,
        sum(b.Mengeb.Preis
        (CASE
        WHEN b.multi = 'ja' THEN 1
        WHEN b.multi = '100' THEN 1
        WHEN b.multi = '200' THEN 2.00
        WHEN ISNULL(b.multi) THEN 1
        END) ) AS count
        FROM praefix_A b
        JOIN praefix_B r
        ON b.G_ID = r.G_ID
        WHERE
        loesch != 1
        FROM_UNIXTIME(r.Timestamp) > NOW() - INTERVAL 1 YEAR
        GROUP BY ym DESC
        ) s
        ON t.Monat = s.ym
        ORDER BY t.Monat DESC

          
        Welche Joinbedingung erzeugt den Fehler? `ON t.Monat = s.ym`{:.language-sql}?  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. Hallo Vinzenz,

          Du hast leider den relevanten Teil ausgelassen: die Spaltendefinitionen.

          Kannst Du mir erklären, warum die relevant für das Problem ist? Ich dachte, es geht um den verwendeten Zeichensatz??

          Welche Joinbedingung erzeugt den Fehler? ON t.Monat = s.ym?

          Ja. Davon gehe ich aus, weil die Subquery alleine funktioniert tadellos.

          Übrigens, wenn ich die Subquery auflöse und es stattdessen über eine temporäre Tabelle mache, funktioniert alles tadellos:

          CREATE TEPORARY TABLE praefix_monatsdaten  
          SELECT FROM_UNIXTIME(r.Timestamp, '%Y%|%m') AS ym,  
          sum(b.Menge*b.Preis*  
          (CASE  
          WHEN b.multi = 'ja' THEN 1  
          WHEN b.multi = '100' THEN 1  
          WHEN b.multi = '200' THEN 2.00  
          WHEN ISNULL(b.multi) THEN 1  
          END) ) AS count  
          FROM praefix_A b  
          JOIN praefix_B r  
          ON b.G_ID = r.G_ID  
          WHERE  
          loesch != 1  
          FROM_UNIXTIME(r.Timestamp) > NOW() - INTERVAL 1 YEAR  
          GROUP BY ym DESC;  
            
            
          SELECT t.Monat, m.COUNT as count  
          from praefix_tmp t  
          LEFT JOIN  
          praefix_monatsdaten m  
          ON t.Monat = m.ym  
          ORDER BY t.Monat DESC;
          

          Diese beiden Queries bringen genau das Ergebnis, das auch die Subquery hätte erziehlen sollen.

          Ich hoffe, das hilft weiter bei der Lösungssuche?

          Gruß, Frank

          1. Hallo Frank,

            Du hast leider den relevanten Teil ausgelassen: die Spaltendefinitionen.

            Kannst Du mir erklären, warum die relevant für das Problem ist? Ich dachte, es geht um den verwendeten Zeichensatz??

            falls in der Spaltendefinition etwas von der Standardkollation (der Tabelle) abweichendes steht, überschreibt dies die Standardkollation der Tabelle. Gleiches gilt für die Standardkollation, die in der Tabellendefinition angegeben ist: diese überschreibt die Standardkollation des Servers.

            Welche Joinbedingung erzeugt den Fehler? ON t.Monat = s.ym?

            Ja. Davon gehe ich aus, weil die Subquery alleine funktioniert tadellos.

            [code lang=sql]CREATE TEPORARY TABLE praefix_monatsdaten

            wie erzeugst Du Dir hier die Monatsspalte?

            SELECT FROM_UNIXTIME(r.Timestamp, '%Y%|%m') AS ym,

            Hier über eine entsprechende Formatzeichenkette. Könnte es eventuell an dieser berechneten Spalte liegen?

            Freundliche Grüße

            Vinzenz

  2. Hallo Frank,

    bei einem Join erhalte ich folgende Fehlermeldung:

    #1267 - Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

    https://forum.selfhtml.org/?t=200982&m=1355112 könnte Dich interessieren.

    Freundliche Grüße

    Vinzenz