Wie ändere ich die Standardkollatierung einer Tabelle?

186
create table check2(f1 varchar(20),f2 varchar(20));

erstellt eine Tabelle mit der Standardkollatierung latin1_general_ci;

alter table check2 collate latin1_general_cs;
show full columns from check2;

zeigt die individuelle Zusammenstellung der Spalten als 'latin1_general_ci'.

Was bewirkt dann der Befehl alter table?

simplfuzz
quelle
Mögliches Duplikat der Sortierung
Michel Ayres
Möglicherweise möchten Sie die richtige Antwort ändern, da ich und viele andere der Meinung zu sein scheinen, dass die zweite die richtige ist.
Ahi Thunfisch

Antworten:

597

So ändern Sie den Standardzeichensatz und die Sortierung einer Tabelle einschließlich der vorhandenen Spalten (beachten Sie die Konvertierungsklausel ):

alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci;

Die Antwort wurde dank der Aufforderung einiger Kommentare bearbeitet:

Sollte es vermeiden, utf8 zu empfehlen. Es ist fast nie das, was Sie wollen, und führt oft zu unerwarteten Problemen. Der utf8-Zeichensatz ist nicht vollständig mit UTF-8 kompatibel. Der Zeichensatz utf8mb4 ist genau das, was Sie wollen, wenn Sie UTF-8 wollen. - Rich Remer 28. März 18 um 23:41 Uhr

und

Das scheint ziemlich wichtig zu sein, ich bin froh, dass ich die Kommentare gelesen habe und danke @RichRemer. Nikki, ich denke, du solltest das in deiner Antwort bearbeiten, wenn du bedenkst, wie viele Aufrufe dies hat. Siehe hier https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html und hier Was ist der Unterschied zwischen utf8mb4- und utf8-Zeichensätzen in MySQL? - Paulpro 12. März um 17:46 Uhr

Nikki Erwin Ramirez
quelle
4
Welche Auswirkungen hat das Ändern des Standardzeichensatzes? Aktualisiert es vorhandene Daten und muss daher die Tabelle durchlaufen und Aktualisierungen vornehmen, sie sperren usw.?
gewähren
utf8_binist besser, nicht wahr? Was ist der Unterschied zwischen utf8_binund utf8_unicode_ci?
Jasom Dotnet
1
Das ist nur ein Beispiel, das ich verwendet habe. Der Unterschied besteht darin, dass zwischen utf8_binGroß- und Kleinschreibung unterschieden wird und zwischen utf8_unicode_ciGroß- und Kleinschreibung nicht unterschieden wird. Eines ist nicht unbedingt besser als das andere - verwenden Sie alles, was Ihren Bedürfnissen entspricht.
Nikki Erwin Ramirez
12
@ JasomDotnet sollten Sie jetzt utf8mb4_unicode_ci stackoverflow.com/questions/766809/…
Taufe
2
Sollte eine Empfehlung vermeiden utf8. Es ist fast nie das, was Sie wollen, und führt oft zu unerwarteten Problemen. Der utf8Zeichensatz ist nicht vollständig mit UTF-8 kompatibel. Der utf8mb4Zeichensatz ist genau das, was Sie wollen, wenn Sie UTF-8 wollen.
Rich Remer
34

MySQL verfügt über 4 Sortierstufen: Server, Datenbank, Tabelle, Spalte. Wenn Sie die Sortierung des Servers, der Datenbank oder der Tabelle ändern, ändern Sie nicht die Einstellung für jede Spalte, sondern die Standardkollatierungen.

Wenn Sie beispielsweise die Standardkollatierung einer Datenbank ändern, verwendet jede neue Tabelle, die Sie in dieser Datenbank erstellen, diese Kollatierung. Wenn Sie die Standardkollatierung einer Tabelle ändern, erhält jede Spalte, die Sie in dieser Tabelle erstellen, diese Kollatierung.

fredrik
quelle
8
Tatsächlich verfügt MySQL über FÜNF Sortierstufen. Es gibt eine Standardeinstellung für die Zeichensatzstufe, die viele Leute vergessen.
Devy
6
Es gibt auch eine Verbindungssortierung show variables like "collation%";, also ist insgesamt SIX .
Dzmitry Lazerka
9

Es legt die Standardkollatierung für die Tabelle fest. Wenn Sie eine neue Spalte erstellen, sollte diese mit latin_general_ci sortiert werden - denke ich. Geben Sie die Sortierung für die einzelne Spalte an und prüfen Sie, ob dies funktioniert. MySQL hat ein wirklich bizarres Verhalten in Bezug auf die Art und Weise, wie es damit umgeht.

Don Werve
quelle
3

Möglicherweise muss die Tabelle SCHEMA nicht nur geändert werden

ALTER SCHEMA `<database name>`  DEFAULT CHARACTER SET utf8mb4  DEFAULT COLLATE utf8mb4_unicode_ci (as Rich said - utf8mb4);

(mariaDB 10)

AssyK
quelle
<database name>statt<table name>
dnivog
1
Siehe meinen Kommentar zur akzeptierten Antwort, warum Sie nicht empfehlen sollten utf8, aber utf8mb4.
Rich Remer