#1267 - Illegal mix of collations
Franco
- datenbank
0 Vinzenz Mai0 Franco0 Vinzenz Mai0 Franco
0 Vinzenz Mai
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
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
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
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
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
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
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