4 Stimmen

MySQL: Kollationierung von utf8_bin auf utf8_unicode_ce ändern

Wie ändere ich bei einer vollständigen Tabelle die Sortierung von utf8_bin in utf8_unicode_ce? Die normale "alter"-Abfrage funktioniert nicht, da "doppelte Eintragsfehler" auftreten. Zum Beispiel gibt es zwei Einträge

David Hussa

y

David Hußa

Ich weiß, dass sie identisch sind. Gibt es einen eleganten Weg, MySQL zu sagen, dass die Einträge "zusammengeführt" werden sollen? Ich sollte erwähnen, dass die ID der Einträge in anderen Tabellen als Referenz verwendet wird, so dass dies auch von MySQL respektiert werden muss. Oder muss ich dies auf die lange und lästige Art und Weise tun: Das heißt, ich muss jedes Duplikat manuell zusammenführen und dann die Sortierung ändern?

Die Tabelle sieht wie folgt aus:

delimiter $$

CREATE TABLE `authors` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_bin NOT NULL,
  `count` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`),
  FULLTEXT KEY `name_FULLTEXT` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=930710 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Stores all authors from dblp.xml.'$$

5voto

Quassnoi Punkte 396418

Sie können die doppelten Einträge löschen:

DELETE  a2
FROM    authors a1
JOIN    authors a2
ON      a2.name COLLATE UTF8_GENERAL_CI = a1.name COLLATE UTF8_GENERAL_CI
        AND a2.id < a1.id

Beachten Sie, dass dies bei einem großen Tisch sehr lange dauern kann.

Es wäre besser, dies zu tun:

  • Lassen Sie die UNIQUE Einschränkung

  • Ändern Sie die Sortierung

  • Erstellen Sie einen einfachen, nicht eindeutigen Index auf name

  • Führen Sie die Abfrage aus (ohne COLLATE Klausel):

    DELETE  a2
    FROM    authors a1
    JOIN    authors a2
    ON      a2.name = a1.name
            AND a2.id < a1.id
  • Den Index löschen

  • Wiederherstellen der UNIQUE Einschränkung.

Um die referenzierenden Tabellen zu aktualisieren, führen Sie diese Abfragen aus, bevor Sie die Einträge löschen:

UPDATE  child c
JOIN    (
        (
        SELECT  name COLLATE utf8_unicode_ci AS name_ci, MAX(id) AS mid
        FROM    authors
        GROUP BY
                name_ci
        ) pa
        JOIN    authors a
        ON      a.name COLLATE utf8_unicode_ci = name_ci
        )
ON      c.author = a.id
SET     author = mid;

auf alle referenzierenden Tabellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X