Unser vorheriger Programmierer hat die falsche Sortierung in einer Tabelle (MySQL) festgelegt. Er hat es mit lateinischer Kollatierung eingerichtet, wenn es UTF8 sein sollte, und jetzt habe ich Probleme. Jede Platte mit chinesischem und japanischem Schriftzeichen dreht sich um ??? Charakter.
Ist es möglich, die Sortierung zu ändern und die Details des Charakters zurückzugewinnen?
Antworten:
Datenbankkollatierung ändern:
Tabellensortierung ändern:
Spaltenkollation ändern:
Was bedeuten die Teile von
utf8mb4_0900_ai_ci
?Mehr Info:
quelle
CHARACTER SET utf8
wird standardmäßig verwendet,utf8_general_ci
aber Sie können die SortierungALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
bei Bedarf auch so definierencreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
. Wenn Sie es ändern möchtenutf8_unicode_ci
, können Sie die Sortierung definieren :ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Dies funktioniert bei Tabellen genauso wie bei Datenbanken, wie @KCD hervorgehoben hat.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Sie sollten dasselbe für die beiden anderen Anweisungen tun.Hier erfahren Sie, wie Sie alle Datenbanken / Tabellen / Spalten ändern. Führen Sie diese Abfragen aus, und sie geben alle nachfolgenden Abfragen aus, die zum Konvertieren Ihres gesamten Schemas in utf8 erforderlich sind. Hoffe das hilft!
- Ändern Sie die DATABASE-Standardkollatierung
- Ändern Sie TABLE Collation / Char Set
- Ändern Sie COLUMN Collation / Char Set
quelle
Beachten Sie, dass in MySQL der
utf8
Zeichensatz nur eine Teilmenge des realen UTF8-Zeichensatzes ist. Um ein Byte Speicherplatz zu sparen, hat das MySQL-Team beschlossen, nur drei Bytes eines UTF8-Zeichens anstelle der vollen vier Bytes zu speichern. Das bedeutet, dass einige ostasiatische Sprachen und Emoji nicht vollständig unterstützt werden. Verwenden Sie denutf8mb4
Datentyp undutf8mb4_bin
oderutf8mb4_general_ci
in MySQL, um sicherzustellen, dass Sie alle UTF8-Zeichen speichern können.quelle
utf8mb4_unicode_ci
anstelle von zu verwendenutf8mb4_general_ci
. Siehe stackoverflow.com/questions/766809/… und drupal.stackexchange.com/questions/166405/…Zusätzlich zu dem, was David Whittaker gepostet hat, habe ich eine Abfrage erstellt, die die vollständige Anweisung zum Ändern von Tabellen und Spalten generiert, mit der jede Tabelle konvertiert wird. Es kann eine gute Idee sein, zu rennen
SET SESSION group_concat_max_len = 100000;
zuerst sicherstellen , dass Ihre Gruppe concat geht nicht über die sehr kleine Grenze gesehen hier .
Ein Unterschied zwischen der vorherigen Antwort besteht darin, dass utf8 anstelle von ut8mb4 verwendet wurde und t1.data_type mit t1.CHARACTER_MAXIMUM_LENGTH für Aufzählungen nicht funktioniert hat. Außerdem schließt meine Abfrage Ansichten aus, da diese separat geändert werden müssen.
Ich habe einfach ein Perl-Skript verwendet, um alle diese Änderungen als Array zurückzugeben, und sie durchlaufen, die zu langen Spalten korrigiert (im Allgemeinen waren sie varchar (256), wenn die Daten im Allgemeinen nur 20 Zeichen enthielten, so dass dies eine einfache Lösung war ).
Ich habe festgestellt, dass einige Daten beim Ändern von latin1 -> utf8mb4 beschädigt wurden. Es schien, als ob utf8-codierte lateinische Zeichen in Spalten bei der Konvertierung vermasselt würden. Ich habe einfach Daten aus den Spalten gespeichert, von denen ich wusste, dass sie vor und nach der Änderung ein Speicherproblem darstellen würden, und sie verglichen und Aktualisierungsanweisungen generiert, um die Daten zu korrigieren.
quelle
Hier wird der Prozess gut beschrieben. Einige der Charaktere, die nicht in den lateinischen Raum passten, sind jedoch für immer verschwunden. UTF-8 ist ein SUPERSET von latin1. Nicht umgekehrt. Die meisten passen in einen Einzelbyte-Raum, undefinierte jedoch nicht (überprüfen Sie eine Liste von latin1 - abhängig von der latin1-Definition von mysql sind nicht alle 256 Zeichen definiert).
quelle