2012-08-02 3 views
96

Fehlernachricht auf MySql: Illegal Mischung aus Sortierungen (utf8_unicode_ci, IMPLICIT) und (utf8_general_ci, IMPLICIT) für den Betrieb '='Illegal Mischung aus Sortierungen (utf8_unicode_ci, IMPLICIT) und (utf8_general_ci, IMPLICIT) für den Betrieb '='

Ich habe mehrere andere Beiträge durchgesehen und war nicht in der Lage, dieses Problem zu lösen. Der Teil betroffen ist etwas ähnlich wie diese:

CREATE TABLE users (
    userID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    firstName VARCHAR(24) NOT NULL, 
    lastName VARCHAR(24) NOT NULL, 
    username VARCHAR(24) NOT NULL, 
    password VARCHAR(40) NOT NULL, 
    PRIMARY KEY (userid) 
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

CREATE TABLE products (
    productID INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    title VARCHAR(104) NOT NULL, 
    picturePath VARCHAR(104) NULL, 
    pictureThumb VARCHAR(104) NULL, 
    creationDate DATE NOT NULL, 
    closeDate DATE NULL, 
    deleteDate DATE NULL, 
    varPath VARCHAR(104) NULL, 
    isPublic TINYINT(1) UNSIGNED NOT NULL DEFAULT '1', 
    PRIMARY KEY (productID) 
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

CREATE TABLE productUsers (
    productID INT UNSIGNED NOT NULL, 
    userID INT UNSIGNED NOT NULL, 
    permission VARCHAR(16) NOT NULL, 
    PRIMARY KEY (productID,userID), 
    FOREIGN KEY (productID) REFERENCES products (productID) ON DELETE RESTRICT ON UPDATE NO ACTION, 
    FOREIGN KEY (userID) REFERENCES users (userID) ON DELETE RESTRICT ON UPDATE NO ACTION 
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Die gespeicherte Prozedur ich benutze, ist dies:

CREATE PROCEDURE updateProductUsers (IN rUsername VARCHAR(24),IN rProductID INT UNSIGNED,IN rPerm VARCHAR(16)) 
BEGIN 
    UPDATE productUsers 
     INNER JOIN users 
     ON productUsers.userID = users.userID 
     SET productUsers.permission = rPerm 
     WHERE users.username = rUsername 
     AND productUsers.productID = rProductID; 
END 

ich mit php testete, aber der gleiche Fehler mit SQLyog gegeben. Ich habe auch getestet, die gesamte DB neu zu erstellen, aber nicht gut.

Jede Hilfe wird sehr geschätzt.

Antwort

136

Es gibt vier Optionen:

Option 1: COLLATE auf Ihre Eingangsgröße hinzu:

SET @rUsername = ‘aname’ COLLATE utf8_unicode_ci; -- COLLATE added 
CALL updateProductUsers(@rUsername, @rProductID, @rPerm); 

Option 2: add COLLATE zum WHERE Klausel:

CREATE PROCEDURE updateProductUsers(
    IN rUsername VARCHAR(24), 
    IN rProductID INT UNSIGNED, 
    IN rPerm VARCHAR(16)) 
BEGIN 
    UPDATE productUsers 
     INNER JOIN users 
     ON productUsers.userID = users.userID 
     SET productUsers.permission = rPerm 
     WHERE users.username = rUsername COLLATE utf8_unicode_ci -- COLLATE added 
     AND productUsers.productID = rProductID; 
END 

Optio n 3: fügen Sie es dem IN Parameterdefinition:

CREATE PROCEDURE updateProductUsers(
    IN rUsername VARCHAR(24) COLLATE utf8_unicode_ci, -- COLLATE added 
    IN rProductID INT UNSIGNED, 
    IN rPerm VARCHAR(16)) 
BEGIN 
    UPDATE productUsers 
     INNER JOIN users 
     ON productUsers.userID = users.userID 
     SET productUsers.permission = rPerm 
     WHERE users.username = rUsername 
     AND productUsers.productID = rProductID; 
END 

Option 4: ändern Sie das Feld selbst:

ALTER TABLE users CHARACTER SET utf8 COLLATE utf8_general_ci; 

als die Standardsortierung für gespeicherte Prozedur Parameter utf8_general_ci ist und Sie können‘ t mische Sortierungen.

Sofern Sie Daten nicht in Unicode-Reihenfolge sortieren müssen, würde ich vorschlagen, alle Ihre Tabellen zu ändern, um utf8_general_ci Sortierung zu verwenden, da es keine Codeänderungen erfordert, und Geschwindigkeit wird leicht sortiert.

+0

Ihre erste Option war die Antwort, die ich für = suchte). Vielen Dank. – Manatax

+1

Es ist auch möglich, String-Konstanten 'COLLATE utf8_unicode_ci' hinzuzufügen: ' SET @EMAIL = '[email protected]' COLLATE utf8_unicode_ci; '. Dies ist besonders nützlich, wenn Sie ein Skript von einer Konsole aus ausführen, wobei die Standardcodierung der Konsole für die Sortierung der Zeichenfolgenkonstanten gilt. – gaborsch

+0

Oder Datenbank löschen und mit utf8_general_ci neu erstellen; Kollation. – Oleksii

16

Ich verbrachte einen halben Tag damit, nach Antworten zu einem identischen "Illegal Mix of Collations" -Fehler mit Konflikten zwischen utf8_unicode_ci und utf8_general_ci zu suchen.

Ich habe festgestellt, dass einige Spalten in meiner Datenbank nicht speziell zusammengestellt wurden utf8_unicode_ci. Es scheint, dass mysql diese Spalten implizit zusammengeführt utf8_general_ci.

Insbesondere ausgegeben, um eine 'SHOW CREATE TABLE table1' query läuft in etwa wie folgt:

| table1 | CREATE TABLE `table1` (
`id` int(11) NOT NULL, 
`col1` varchar(4) CHARACTER SET utf8 NOT NULL, 
`col2` int(11) NOT NULL, 
PRIMARY KEY (`photo_id`,`tag`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

Beachten Sie die Zeile 'col1' varchar (4) Zeichensatz Utf8 NOT NULL nicht über eine Sortierungs angegeben.Ich lief dann die folgende Abfrage:

ALTER TABLE table1 CHANGE col1 col1 VARCHAR(4) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;

Das ist mein "Illegal Mix von Sortierungen" Fehler behoben. Hoffe, das könnte jemand anderen da draußen helfen.

+4

danke. 'SHOW CREATE TABLE' ist der einfachste Weg, um die Ursache des Problems zu verstehen und zu beheben. – joro

4

Ich hatte ein ähnliches Problem, aber es kam mir innerhalb der Prozedur, wenn mein Abfrageparameter mit Variable z. SET @value='foo'.

Was dies verursacht wurde, war nicht übereinstimmende collation_connection und Datenbank Sortierung. Geändert collation_connection, um collation_database zu entsprechen und Problem ging weg. Ich denke, das ist ein eleganterer Ansatz als das Hinzufügen von COLLATE nach Param/Value.

Zusammenfassend: alle Sortierungen müssen übereinstimmen. Verwenden Sie SHOW VARIABLES und stellen Sie sicher, dass collation_connection und collation_database übereinstimmen (überprüfen Sie auch die Tabellenkollation mit SHOW TABLE STATUS [table_name]).

+0

Das gleiche Problem ist mir passiert, ich vermied es, die collation_YYY-Variablen zu ändern, indem ich die Kollation direkt in der Variablendeklaration anwendete. 'SET @my_var = 'string1, string2' COLLATE utf8_unicode_ci;' – nkatsar

1

Ein bisschen ähnlich zu @bpile Antwort, mein Fall war eine my.cnf Eintragseinstellung collation-server = utf8_general_ci. Nachdem ich festgestellt, dass (und alles, was oben, nachdem er versuchte), ich meine Datenbank mit Gewalt statt utf8_unicode_ci utf8_general_ci geschaltet und das war es:

ALTER DATABASE `db` CHARACTER SET utf8 COLLATE utf8_general_ci; 
+1

Es ist seltsam, dass die Konfigurationen so verteilt sind. Alle Sortierstandardeinstellungen sollten an derselben Stelle festgelegt werden. – Manatax

Verwandte Themen