Mysql
 sql >> Datenbank >  >> RDS >> Mysql

varchar(20) und varchar(50) sind gleich?

MySQL bietet eine Auswahl an Speicher-Engines. Die physische Speicherung von Daten hängt von der Speicher-Engine ab.

MyISAM Speicherung von VARCHAR

In MyISAM VARCHAR s belegen normalerweise nur die tatsächliche Länge des Strings plus ein oder zwei Bytes Länge. Dies wird durch die Designbeschränkung von MyISAM auf das Sperren von Tabellen im Gegensatz zu einer Fähigkeit zum Sperren von Zeilen praktikabel. Zu den Folgen für die Leistung gehören ein kompakteres Cache-Profil, aber auch eine kompliziertere (langsamere) Berechnung von Datensatz-Offsets.

(Tatsächlich gibt Ihnen MyISAM eine gewisse Auswahl zwischen Tabellenformaten mit fester physikalischer Zeilengröße und variabler physikalischer Zeilengröße in Abhängigkeit von Spaltentypen, die in der gesamten Tabelle vorkommen. Auftreten von VARCHAR ändert nur die Standardmethode, aber das Vorhandensein eines TEXT blob Kräfte VARCHAR s in derselben Tabelle, um auch die Methode mit variabler Länge zu verwenden.)

Die physische Speichermethode ist besonders wichtig bei Indizes, was eine andere Geschichte ist als bei Tabellen. MyISAM verwendet für beide die Leerzeichenkomprimierung CHAR und VARCHAR Spalten, was bedeutet, dass kürzere Daten in beiden Fällen weniger Platz im Index einnehmen.

InnoDB-Speicherung von VARCHAR

InnoDB verwendet, wie die meisten anderen aktuellen relationalen Datenbanken, einen ausgeklügelteren Mechanismus. VARCHAR Spalten, deren maximale Breite weniger als 768 Bytes beträgt, werden inline gespeichert, wobei Platz entsprechend dieser maximalen Breite reserviert wird. Genauer hier :

InnoDB führt derzeit keine Speicherplatzkomprimierung in seinen Indizes durch, im Gegensatz zu MyISAM, wie oben beschrieben.

Zurück zur Frage

All dies ist jedoch nur ein Implementierungsdetail, das sich sogar zwischen den Versionen ändern kann. Der wahre Unterschied zwischen CHAR und VARCHAR ist semantisch, ebenso wie der zwischen VARCHAR(20) und VARCHAR(50) . Indem sichergestellt wird, dass es keine Möglichkeit gibt, eine Zeichenfolge mit 30 Zeichen in einem VARCHAR(20) zu speichern , macht die Datenbank das Leben für verschiedene Prozessoren und Anwendungen, die sie angeblich in eine sich vorhersehbar verhaltende Lösung integriert, einfacher und besser definiert. Das ist die große Sache.

Speziell in Bezug auf Personennamen diese Frage kann Ihnen eine praktische Anleitung geben. Personen mit vollständigen Namen über 70 UTF-8-Zeichen haben sowieso Probleme.