phpMyAdmin
 sql >> Datenbank >  >> Database Tools >> phpMyAdmin

Was passiert mit vorhandenen Daten, wenn ich die Sortierung einer Spalte in MySQL ändere?

Der Artikel http://mysqldump.azundris.com/archives/60 -Umgang mit Zeichensätzen.html diskutiert dies ausführlich und zeigt auch, was passieren wird.

Bitte beachten Sie, dass Sie einen CHARACTER SET (eigentlich eine Kodierung) mit einer COLLATION verwechseln.

Ein Zeichensatz definiert die physische Darstellung einer Zeichenfolge in Bytes auf der Festplatte. Sie können dies sichtbar machen, indem Sie die Funktion HEX() verwenden, zum Beispiel SELECT HEX(str) FROM t WHERE id = 1 um zu sehen, wie MySQL die Bytes Ihres Strings speichert. Was MySQL Ihnen liefert, kann unterschiedlich sein, abhängig vom Zeichensatz Ihrer Verbindung, definiert mit SET NAMES .... .

Eine Sortierung ist eine Sortierreihenfolge. Es ist vom Zeichensatz abhängig. Ihre Daten können beispielsweise im Zeichensatz latin1 vorliegen, aber nach einer der beiden deutschen Sortierreihenfolgen latin1_german1_ci oder latin1_german2_ci sortiert sein. Abhängig von Ihrer Wahl werden Umlaute wie ö entweder als oe oder als o sortiert.

Wenn Sie einen Zeichensatz ändern, müssen die Daten in Ihrer Tabelle neu geschrieben werden. MySQL liest alle Daten und alle Indizes in der Tabelle, erstellt eine versteckte Kopie der Tabelle, die vorübergehend Speicherplatz belegt, verschiebt dann die alte Tabelle an einen versteckten Ort, verschiebt die versteckte Tabelle an ihren Platz und löscht dann die alten Daten, wodurch sie freigegeben wird Speicherplatz freigeben. Für einige Zeit zwischendurch benötigen Sie dafür den doppelten Speicherplatz.

Wenn Sie eine Sortierung ändern, ändert sich die Sortierreihenfolge der Daten, aber nicht die Daten selbst. Wenn die Spalte, die Sie ändern, nicht Teil eines Indexes ist, müssen Sie nichts tun, außer die frm-Datei neu zu schreiben, und ausreichend aktuelle Versionen von MySQL sollten nicht mehr tun.

Wenn Sie eine Sortierung einer Spalte ändern, die Teil eines Indexes ist, muss der Index neu geschrieben werden, da ein Index ein sortierter Auszug aus einer Tabelle ist. Dadurch wird erneut die oben beschriebene ALTER TABLE-Tabellenkopierlogik ausgelöst.

MySQL versucht dabei, Daten zu erhalten:Solange die Daten, die Sie haben, im Zielzeichensatz dargestellt werden können, ist die Konvertierung nicht verlustbehaftet. Warnungen werden ausgegeben, wenn Daten abgeschnitten werden, und Daten, die nicht im Zielzeichensatz dargestellt werden können, werden durch ?

ersetzt