Der Unterschied zwischen char und varchar in MySQL

Der Unterschied zwischen char und varchar in MySQL

CHAR- und VARCHAR-Typen sind ähnlich und unterscheiden sich hauptsächlich in der Speicherung, den nachstehenden Leerzeichen und den Abrufmethoden.

Die Ähnlichkeiten zwischen CHAR und VARCHAR sind: Sowohl CHAR als auch VARCHAR geben die Zeichenlänge an. Beachten Sie, dass es sich um die Zeichenlänge handelt. Beispielsweise können char(30) und varchar(30) beide 30 Zeichen speichern. Zu beachten ist, dass bei der UTF8MB4-Kodierung jedes Zeichen 4 Knoten belegt. In UTF8 benötigt jedes Zeichen 3 Bytes. Wenn die zu speichernden Zeichen die durch CHAR/VARCHAR angegebene Maximallänge überschreiten. Wenn der SQL-Modus nicht aktiviert ist, wird die zu speichernde Zeichenfolge abgeschnitten und nur die ersten 30 Zeichen werden gespeichert.

Die Werte in einer CHAR-Spalte sind Zeichenfolgen mit fester Länge. Die Länge kann als Wert zwischen 0 und 255 Zeichen angegeben werden (z.B. utf8mb4: 0-255*4 Bytes). Wenn CHAR zum Speichern von Zeichen verwendet wird, wird beispielsweise CHAR(30) als Beispiel verwendet. Wenn die Länge weniger als 30 Zeichen beträgt, wird rechts mit Leerzeichen aufgefüllt. Beim Abrufen von CHAR-Werten werden nachstehende Leerzeichen entfernt, sofern nicht der SQL-Modus sqlmode:PAD_CHAR_TO_FULL-LENGTH aktiviert ist.

Die Werte in einer VARCHAR-Spalte sind Zeichenfolgen mit variabler Länge. Die Länge kann als Wert zwischen 0 und 65535 Byte angegeben werden. Die effektive Maximallänge eines VARCHAR hängt von der maximalen Zeilengröße (65535 Bytes, gemeinsam für alle Spalten) und dem verwendeten Zeichensatz ab.

Im Gegensatz zu CHAR speichert VARCHAR beim Speichern von Daten zusätzliche 1-2 Bytes (beispielsweise werden diese 1-2 Bytes bei varchar(4) nicht zur 4-Zeichen-Länge gezählt, sodass Sie sich keine Gedanken über das Abschneiden machen müssen). Diese 1-2 Bytes werden verwendet, um die Länge der Datenzeichen aufzuzeichnen. Wenn die Datenzeichenlänge kleiner oder gleich 255 ist, verwenden Sie 1 Byte zum Aufzeichnen der Datenlänge. Ist er größer, werden zwei Bytes verwendet. CHAR speichert nur die Daten selbst. Wie in der Abbildung unten gezeigt.

(Mythos: varchar ist bei Abfragen langsamer als char, da die Bytelänge von varchar (X) berechnet wird)

Bei der Latin1-Kodierung kann Latin1 keine chinesischen Schriftzeichen speichern. Englische Buchstaben bestehen aus 1 Byte.

Wert CHAR(4) Erforderlicher Speicherplatz VARCHAR(4) Erforderlicher Speicherplatz
'' ' ' 4 Byte '' 1 Byte
'ab' 'ab ' 4 Byte 'ab' 3 Byte
'abcd' 'abcd' 4 Byte 'abcd' 5 Byte
'abcdefgh' 'abcd' 4 Byte 'abcd' 5 Byte

Beachten Sie, dass VARCHAR-Werte beim Speichern nicht mit Leerzeichen aufgefüllt werden. Beim Speichern und Abrufen von Werten bleiben nachstehende Leerzeichen gemäß Standard-SQL erhalten. Bei CHAR ist es das Gegenteil. CHAR wird beim Speichern mit Leerzeichen aufgefüllt und die nachstehenden Leerzeichen werden beim Abrufen entfernt, unabhängig davon, ob die nachstehenden Leerzeichen automatisch ausgefüllt werden oder in den Daten selbst enthalten sind. Zum Beispiel:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)
 
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
 
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 Zeile im Satz (0,06 Sek.)<br><br><br>

Machen Sie drei Experimente.

mysql> anzeigen, Tabelle erstellen vc;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Tabelle | Tabelle erstellen |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| vc | TABELLE ERSTELLEN `vc` (
 `v` varchar(4) DEFAULT NULL,
 `c` char(4) DEFAULT NULL,
 EINZIGARTIGER SCHLÜSSEL `v_UNIQUE` (`v`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

1. Abfrageanweisung, wobei Feld = „ab“ ist;

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc, wobei v=' ab ';
Leerer Satz (0,00 Sek.)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc, wobei c=' ab ';
Leerer Satz (0,00 Sek.)

2. Abfrageanweisung, wobei Feld = 'ab ';

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where v='ab ';
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
+--------------------+--------------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where c='ab ';
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
+--------------------+--------------------+
1 Zeile im Set (0,00 Sek.)<br><br><br>Bei allen Zeichenfolgenvergleichen, egal ob varchar, text oder char, werden nachstehende Leerzeichen ignoriert, mit Ausnahme der like-Klausel, die nachstehende Leerzeichen nicht entfernt, wie unten gezeigt<br><br>
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc, wobei c wie 'ab' ist; (kein Leerzeichen am Ende)
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
| ( ab ) | ( ab ) |
+--------------------+--------------------+
2 Zeilen im Satz (0,00 Sek.)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc, wobei c wie 'ab '; (mit abschließendem Leerzeichen) ist
Leerer Satz (0,00 Sek.)
 
 
 
CHAR wird beim Speichern mit Leerzeichen aufgefüllt und nachstehende Leerzeichen werden beim Abrufen entfernt, unabhängig davon, ob die nachstehenden Leerzeichen automatisch aufgefüllt werden oder Teil der Daten selbst sind. Diese Aktion zum Entfernen des nachstehenden Leerzeichens erfolgt vor dem Vergleich mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc, wobei v wie 'ab ' ist; (es gibt ein nachstehendes Leerzeichen).
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
+--------------------+--------------------+
1 Zeile im Satz (0,01 Sek.)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc, wobei v wie 'ab' ist; (kein Leerzeichen am Ende)
Leerer Satz (0,00 Sek.)

3. Legen Sie einen eindeutigen Index für varchar fest, um zu sehen, ob ‚ab‘ und ‚ab‘ gleichzeitig vorhanden sein können

mysql> einfügen in vc (v,c)values('ab ', 'ab ')
 -> ;
FEHLER 1062 (23000): Doppelter Eintrag „ab“ für Schlüssel „v_UNIQUE“
mysql> einfügen in vc (v,c)values(' ab ', 'ab ')
 -> ;
Abfrage OK, 1 Zeile betroffen, 1 Warnung (0,00 Sek.)<br>Dies weist darauf hin, dass zwar der nachstehende Leerraum von varchar beibehalten werden kann, dem Index jedoch zusätzliche Beschränkungen auferlegt zu sein scheinen. Wenn varchar ein eindeutiger Index ist und sich die eingefügten Werte nur in der Anzahl der nachstehenden Leerzeichen unterscheiden, wird ein doppelter Schlüssel gemeldet.

Apropos Byte-Grenzen: Ich möchte Sie auch daran erinnern. Auch die Indexlänge ist begrenzt:

Die Länge jeder Indexspalte der InnoDB-Engine ist auf 767 Byte begrenzt und die Gesamtlänge aller Indexspalten kann 3072 Byte nicht überschreiten. Beachten Sie, dass es sich um Bytes handelt. Die Byteberechnung von varchar(256) ist in verschiedenen Kodierungen unterschiedlich. Beispielsweise belegt in utf8mb4 ein Zeichen 4 Bytes und 256 Zeichen = 1024 Bytes. Der Effekt einer Indexabdeckung kann nicht erreicht werden. Dies entspricht der Erstellung eines Präfixindexes (sehr wichtig, der Präfixindex muss für die sekundäre Abfrage an die (Primärschlüssel-)Tabelle zurückgegeben werden).

Die InnoDB-Engine kann die Längenbeschränkung einer einzelnen Indexspalte auf 3072 Bytes erhöhen, indem sie innodb_large_prefix=on konfiguriert (globaler Parameter, dynamisch wirksam).

  • In MySQL 5.7 wird durch den Standardwert innodb_large_prefix=1 die Längenbeschränkung von 767 Byte aufgehoben, die maximale Länge eines einspaltigen Indexes darf jedoch 3072 Byte nicht überschreiten.
  • In MySQL 5.6 begrenzt der Standardwert innodb_large_prefix=0 die Länge eines einzelnen Spaltenindex auf maximal 767 Byte. Sie müssen innodb_large_prefix=ON, innodb_file_format=barracuda, innodb_file_per_table=ON festlegen und das Speicherformat der Innodb-Tabelle ist DYNAMIC oder COMPRESSED. Dann kann der Präfixindex bis zu 3072 Bytes enthalten.

Oben finden Sie detaillierte Informationen zum Unterschied zwischen char und varchar in MySQL. Weitere Informationen zu char und varchar in MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Als der Interviewer nach dem Unterschied zwischen char und varchar in mysql fragte
  • Der Unterschied zwischen den Feldtypen char, varchar und Text in MySQL
  • Der Unterschied zwischen VARCHAR- und CHAR-Formatdaten in MySQL
  • Analyse der Unterschiede zwischen char und varchar in der MySQL-Datenbank und Verwendungsvorschläge
  • Analyse des Unterschieds zwischen char und varchar in MySQL
  • Unterschied zwischen varchar- und char-Typen in MySQL

<<:  Implementierung einer zirkulären Scroll-Listenfunktion basierend auf Vue

>>:  Verwendung des Linux-Befehls gzip

Artikel empfehlen

JavaScript generiert dynamisch eine Tabelle mit Zeilenlöschfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Einige Fallstricke beim JavaScript Deep Copy

Vorwort Als ich zuvor zu einem Vorstellungsgesprä...

So deinstallieren Sie MySQL 5.7 unter CentOS7

Überprüfen Sie, was in MySQL installiert ist grep...

...

Wie Sie React forwardRef verwenden und was Sie beachten müssen

Bisher konnte react.forwardRef nicht auf höherwer...

Spezifische Verwendung interner temporärer MySQL-Tabellen

Inhaltsverzeichnis UNION Tabelleninitialisierung ...

Fallstudie zum Vue-Einkaufswagen

Inhaltsverzeichnis 1. Warenkorb-Beispiel 2. Code-...

Docker legt Port 2375 frei, was zu Serverangriffen und -lösungen führt

Ich glaube, dass Studenten, die etwas über die Do...

So verwenden Sie eine VLAN-getaggte Ethernet-Karte im CentOS/RHEL-System

In einigen Szenarien möchten wir derselben Ethern...

So installieren Sie MySQL unter Linux (Yum und Quellcode-Kompilierung)

Es gibt zwei Möglichkeiten, MySQL unter Linux zu ...

mysql5.7 Installations- und Konfigurationstutorial unter Centos7.3

In diesem Artikel finden Sie das Installations- u...