Einführung Kennen Sie wirklich den Unterschied zwischen CHAR- und VARCHAR-Typen beim Speichern und Lesen? Lassen Sie mich zunächst einige Schlussfolgerungen ziehen: 1. Beim Speichern wird CHAR vor dem Speichern immer mit Leerzeichen aufgefüllt, unabhängig davon, ob der Benutzer beim Einfügen von Daten am Ende Leerzeichen einfügt. 2. Beim Speichern füllt VARCHAR vor dem Speichern keine Leerzeichen aus. Wenn der Benutzer jedoch beim Einfügen ausdrücklich Leerzeichen hinzufügt, wird es so gespeichert, wie es ist, und nicht gelöscht. 3. Beim Lesen von Daten löscht CHAR immer nachstehende Leerzeichen (auch wenn beim Schreiben Leerzeichen enthalten sind). 4. Beim Lesen von Daten ruft VARCHAR den zuvor gespeicherten Wert immer wahrheitsgetreu ab (wenn beim Speichern ein nachstehendes Leerzeichen vorhanden ist, bleibt dieses weiterhin erhalten und das nachstehende Leerzeichen wird nicht wie bei CHAR gelöscht). Nachfolgend wird der Testüberprüfungsprozess beschrieben. 1. Testen Sie den CHAR-Typ Tabellenstruktur: TABELLE ERSTELLEN `tchar` ( `id` int(10) unsigned NICHT NULL STANDARD '0', `c1` char(20) NICHT NULL STANDARD '', PRIMÄRSCHLÜSSEL (`id`) )ENGINE=InnoDB STANDARD-CHARSET=utf8mb4; Fügen Sie einige Datensätze ein: in tchar-Werte einfügen (1, concat('a', repeat(' ',19))); in tchar-Werte einfügen (2, concat(' ', repeat('a',19))); in Tchar-Werte einfügen (3, 'a'); in Tchar-Werte einfügen (4, ''); in tchar-Werte einfügen (5, ''); Sehen Sie sich die Speicherstruktur an: (1) INFIMUM Datensatzoffset:99 Heap-Nr.:0 ... (2) SUPREMUM-Datensatzoffset:112, Heap-Nr.:1 ... (3) normaler Datensatz-Offset:126 Heap-Nr.:2 ... <- ID=1 (4) normaler Datensatz-Offset:169 Heap-Nr.:3 ... <- ID=2 (5) normaler Datensatz-Offset:212 Heapno:4 ... <- ID=3 (6) normaler Datensatz-Offset:255 Heapno:5 ... <- ID=4 (7) normaler Datensatz-Offset:298 Heapno:6 ... <- ID=5 Sind Sie ein wenig verwirrt, wenn Sie dieses Zeug sehen? Erinnern Sie sich an das Tool, das ich Ihnen empfohlen habe? Schauen Sie hier: innblock | InnoDB-Seitenbeobachtungstool. Wie Sie sehen, nimmt jeder Datensatz unabhängig von der Länge der Zeichenfolge tatsächlich 43 (169-126=43) Bytes ein. Daher gilt Schlussfolgerung 1. Schauen wir uns die Ergebnisse des Lesens der Tchar-Tabelle an: Wählen Sie ID, Concat ('000', c1, '$$$'), Länge (c1) aus tchar. +----+----------------------------+------------+ | ID | concat('000',c1,'$$$') | Länge(c1) | +----+----------------------------+------------+ | 1 | 000a$$$ | 1 | <- nachstehende Leerzeichen entfernen | 2 | 000 aaaaaaaaaaaaaaaaaaaaa$$$ | 20 | | 3 | 000a$$$ | 1 | | 4 | 000$$$ | 0 | <- Entfernen Sie das Leerzeichen am Ende. Das Ergebnis ist dasselbe wie bei id=5 | 5 | 000$$$ | 0 | +----+----------------------------+------------+ 2. Testen Sie den VARCHAR-Typ Tabellenstruktur: CREATE TABLE `tvarchar` ( `id` int(10) unsigned NICHT NULL STANDARD '0', `c1` varchar(20) NICHT NULL STANDARD '', PRIMÄRSCHLÜSSEL (`id`) ) ENGINE=InnoDB STANDARD-CHARSET=utf8mb4 Fügen Sie einige Datensätze ein: in tvarchar-Werte einfügen (1, concat('a', repeat(' ',19))); in tvarchar-Werte einfügen (2, concat(' ', repeat('a',19))); in tvarchar-Werte einfügen (3, 'a'); in tvarchar-Werte einfügen (4, ''); in tvarchar-Werte einfügen (5, ''); in tvarchar-Werte einfügen (6, ''); Sehen Sie sich die Speicherstruktur an: (1) INFIMUM Datensatzoffset:99 Heap-Nr.:0 ... (2) SUPREMUM-Datensatzoffset:112, Heap-Nr.:1 ... (3) normaler Datensatz-Offset:126 Heap-Nr.:2 ... <- ID=1 (4) normaler Datensatz-Offset:169 Heap-Nr.:3 ... <- ID=2 (5) normaler Datensatz-Offset:212 Heapno:4 ... <- ID=3 (6) normaler Datensatz-Offset:236 Heapno:5 ... <- ID=4 (7) normaler Datensatz-Offset:260 Heapno:6 ... <- ID=5 (8) normaler Datensatz-Offset:283 Heapno:7 ... <- ID=6 Es ist ersichtlich, dass die Byteanzahl mehrerer Datensätze wie folgt lautet: 43, 43, 24, 24, 23, 23 (der letzte Datensatz ist derselbe wie der Datensatz mit der ID = 5). Schauen wir uns die Ergebnisse des Lesens der tvarchar-Tabelle an: Wählen Sie ID, Concat ('000', c1, '$$$'), Länge (c1) aus tvarchar. +----+----------------------------+------------+ | ID | concat('000',c1,'$$$') | Länge(c1) | +----+----------------------------+------------+ | 1 | 000a $$$ | 20 | <- nachstehende Leerzeichen werden im Leseergebnis nicht entfernt | 2 | 000 aaaaaaaaaaaaaaaaaaaa$$$ | 20 | | 3 | 000a$$$ | 1 | | 4 | 000 $$$ | 1 | <- Dieses Leerzeichen wird im Leseergebnis nicht gelöscht | 5 | 000$$$ | 0 | | 6 | 000$$$ | 0 | +----+----------------------------+------------+ Generell können zwei Schlussfolgerungen gezogen werden: Sehen wir uns abschließend an, was in der Dokumentation steht:
Die in den obigen Tests verwendeten Versionen und Umgebungen sind: mysql> Version auswählen()\G ... version(): 8.0.15 mysql> wähle @@sql_mode\G ... @@sql_mode: NUR_VOLLSTÄNDIGE_GRUPPE_DURCH, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEINE_ENGINE_SUBSTITUTION Referenzdokumentation 11.4.1 Die CHAR- und VARCHAR-Typen, https://dev.mysql.com/doc/refman/5.7/en/char.html Oben finden Sie ausführliche Informationen zum Unterschied zwischen MySQL CHAR- und VARCHAR-Speicher. Weitere Informationen zu MySQL CHAR und VARCHAR finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: js, um den Effekt des Ziehens des Schiebereglers zu erzielen
>>: Detaillierte Erläuterung des Implementierungsprozesses der ServerSocket-Standard-IP-Bindung
Inhaltsverzeichnis 1. Was ist ein Entwurfsmuster?...
Ich bin kürzlich bei der Arbeit auf ein Problem g...
Entwicklungshintergrund: Ich arbeite derzeit an e...
Inhaltsverzeichnis Docker-System df Docker-System...
Inhaltsverzeichnis 1. Template-Tag in HTML5 2. Ei...
Inhaltsverzeichnis 1. Nginx-Installation und Star...
So erzielen Sie den unten gezeigten Pluszeichen-E...
HTML-Absatz Absätze werden durch das Tag <p>...
Die stabile Version (GA) von MySQL 8.0.18 wurde g...
Wirkung der OperationCode-Implementierung html &l...
Migration ist in vielen Fällen unvermeidlich. Har...
<br />Was ist Web 2.0? Web2.0 umfasst diese ...
Bei Diskussionen über Webstandards kommt immer wie...
Verwenden Sie Nginx, um einen Tomcat9-Cluster zu ...
Inhaltsverzeichnis 1. Subroutensyntax 2. Beispiel...