Was ist der Unterschied zwischen VARCHAR und CHAR?


366

Was ist der Unterschied zwischen VARCHAR und CHAR in MySQL?

Ich versuche, MD5-Hashes zu speichern.


15
MD5-Hash hat immer 32 Zeichen. Um Ihre Leistung zu maximieren, verwenden Sie daher CHAR (32), da CHAR eine feste Länge hat (siehe Antworten unten für weitere Details zu Unterschieden zwischen CHAR und VARCHAR).
Augustin

Antworten:


361

VARCHAR ist variabel lang.

CHAR ist feste Länge.

Wenn Ihr Inhalt eine feste Größe hat, erzielen Sie mit eine bessere Leistung CHAR.

Eine ausführliche Erklärung finden Sie auf der MySQL-Seite zu CHAR- und VARCHAR-Typen (lesen Sie auch die Kommentare).


51
@steven: wenn Anon. "Ihr Inhalt hat eine feste Größe" bedeutet, dass die Zeilen Ihrer Tabelle alle Felder mit fester Größe enthalten müssen. Sie erhalten keine Leistungsverbesserung, wenn Sie CHAR gegen VARCHAR in einem Feld verwenden, die Tabelle jedoch andere Felder enthält, die VARCHAR sind.
Marco Demaio

2
Kein char-Datentyp erhöht die Leistung. Während der Ausführung der Abfrage generiert SQL einen Ausführungsplan. Angenommen, es gibt 2 Spalten charcol char (2000) und VarcharCol Varchar (2000). Im Ausführungsplan wird die geschätzte Zeilengröße für den Spaltentyp varchar möglicherweise unterschätzt. somit führt es den Überlauf auf Temp db. Die Verwendung von char ist also gut für die Leistung
vignesh

1
Was bedeutet der Wert in der Klammer von VARCHAR (n)?
Sivagami Nambi

@ Marco Demaio kennst du den Grund dafür?
Dehan de Croos

1
@ jdc91: Um die Leistung zu steigern, muss die gesamte Zeile eine feste Breite haben. MySQL bietet den Vorteil, den Platzbedarf und den Versatz von Zeilen in dieser Art von Tabelle zu berechnen.
Marco Demaio

225

VERKOHLEN

  1. Dient zum Speichern des Zeichenfolgenwerts mit fester Länge .
  2. Die maximale Nr. Der Datentyp kann 255 Zeichen enthalten .
  3. Es ist 50% schneller als VARCHAR.
  4. Verwendet die statische Speicherzuordnung .

VARCHAR

  1. Wird zum Speichern von alphanumerischen Daten variabler Länge verwendet.
  2. Das Maximum, das dieser Datentyp aufnehmen kann, beträgt bis zu
    • Pre-MySQL 5.0.3: 255 Zeichen .
    • Post-MySQL 5.0.3: 65.535 Zeichen für die Zeile freigegeben.
  3. Es ist langsamer als CHAR.
  4. Verwendet die dynamische Speicherzuordnung .

3
Ich bin etwas überrascht, dass diese Antwort so oft positiv bewertet wurde. Die MySQL-Dokumentation besagtValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
ganz zu schweigen davon, dass Sie alphanumerische Daten auch in char speichern können
Ninjabber

44
Worauf basiert das 50% schneller? 50% schneller was zu tun? Unter welchen Bedingungen? Und was meinen Sie in diesem Zusammenhang mit statischer Speicherzuordnung gegenüber dynamischer?
Martin Smith

4
@ MartinSmith Ich wollte das gleiche fragen .. glaube nicht, dass die Informationen korrekt sind. asktom.oracle.com/pls/asktom/…
Ozgur Bar

2
-1; Die Leistungsansprüche hier sind vage und unbegründet, der Unterschied in der Speicherzuweisungsstrategie (und warum es wichtig ist) wird nicht konkretisiert, und die Behauptung, dass varchar "alphanumerische Daten" speichert, ist etwas seltsam. varchar-Spalten können sicherlich auch nicht-alphanumerische Zeichen speichern!
Mark Amery

122

CHAR gegen VARCHAR

CHAR wird für Variablen mit fester Längengröße verwendet
VARCHAR wird für Größenvariablen mit variabler Länge verwendet.

Z.B

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

Ausgabe wird sein

length(City)          Length(street)
10                    6

Schlussfolgerung: Um Speicherplatz effizient zu nutzen, muss VARCHAR anstelle von CHAR verwendet werden, wenn die variable Länge variabel ist


4
Stadt = char (10), Straße = varchar (10), Stadt = Pune, Straße = Oxford, Länge (Stadt) = 4, Länge (Straße) = 6
abdulwadood

2
Diese Abfrage (Länge (Stadt), Länge (Straße) von Temp auswählen) gibt folgende Ausgabe in MySQL 5.7 MySQL> Länge (Stadt), Länge (Straße) von Temp auswählen; + -------------- + ---------------- + | Länge (Stadt) | Länge (Straße) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 Reihe im Satz (0,00 Sek.)
Jasbeer Rawal

69

Eine CHAR(x)Spalte kann nur genau x Zeichen enthalten.
Eine VARCHAR(x)Spalte kann bis zu x Zeichen enthalten.

Da Ihre MD5-Hashes immer dieselbe Größe haben, sollten Sie wahrscheinlich a verwenden CHAR .

Sie sollten MD5 jedoch nicht in erster Linie verwenden. es hat Schwächen gekannt.
Verwenden Sie stattdessen SHA2.
Wenn Sie Passwörter haschen, sollten Sie bcrypt verwenden.


44
"Eine CHAR (x) -Spalte kann nur genau x Zeichen enthalten." Eigentlich können Sie Daten mit weniger als x Zeichen hinzufügen, aber ich denke, Sie haben gemeint, dass hinter den Kulissen immer 10 Zeichen Speicherplatz reserviert sind.
Dan W

13
Sie wissen nicht, warum sie MD5-Hashes speichern. Es gibt viele, viele gültige Gründe für die Verwendung von MD5, die nichts mit Sicherheit zu tun haben. Kollisionen sind überhaupt nicht häufig und der Algorithmus ist schneller als sicherere.
John Hunt

1
Angenommen, die Spalte CHAR (x) erzwingt die x-Zeichen nicht genau. Gibt es einen Grund, sie auch für Daten mit fester Größe über VARCHAR (x) zu verwenden?
NeverEndingQueue

11

Was ist der Unterschied zwischen VARCHAR und CHAR in MySQL?

Zu bereits gegebenen Antworten möchte ich hinzufügen, dass in OLTP- Systemen oder in Systemen mit häufigen Aktualisierungen CHARaufgrund möglicher VARCHARSpaltenfragmentierung während Aktualisierungen die Verwendung auch für Spalten variabler Größe in Betracht gezogen wird .

Ich versuche, MD5-Hashes zu speichern.

MD5-Hash ist nicht die beste Wahl, wenn Sicherheit wirklich wichtig ist. Wenn Sie jedoch eine Hash-Funktion verwenden, ziehen BINARYSie stattdessen den Typ in Betracht (z. B. erzeugt MD5 einen 16-Byte-Hash, BINARY(16)was anstelle von CHAR(32)32 Zeichen für hexadezimale Ziffern ausreicht . Dies würde mehr Platz sparen und die Leistung beeinträchtigen.


Nach diesem Gedankengang würde ich CHAR für Geschäfts-IDs verwenden, die für Lesbarkeit und Effizienz gedacht sind. Ich würde trotzdem Bigint-Primärschlüssel verwenden.
Archimedes Trajano

9

Varchar schneidet nachgestellte Leerzeichen ab, wenn die eingegebenen Zeichen kürzer als die angegebene Länge sind, während char dies nicht tut. Char füllt Leerzeichen auf und ist immer die Länge der angegebenen Länge. In Bezug auf die Effizienz ist varchar geschickter, da es Zeichen trimmt, um mehr Anpassungen zu ermöglichen. Wenn Sie jedoch die genaue Länge von char kennen, wird char mit etwas mehr Geschwindigkeit ausgeführt.


7

In den meisten heutigen RDBMS sind sie Synonyme. Für Systeme, die noch eine Unterscheidung aufweisen, wird jedoch ein CHAR-Feld als Spalte mit fester Breite gespeichert. Wenn Sie es als CHAR (10) definieren, werden 10 Zeichen in die Tabelle geschrieben, wobei "Auffüllen" (normalerweise Leerzeichen) verwendet wird, um alle Leerzeichen auszufüllen, die die Daten nicht belegen. Zum Beispiel würde das Speichern von "bob" als ("bob" +7 Leerzeichen) gespeichert. Eine VARCHAR-Spalte (variables Zeichen) soll Daten speichern, ohne den zusätzlichen Speicherplatz zu verschwenden, den eine CHAR-Spalte bietet.

Wie immer spricht Wikipedia lauter.


5

CHAR ist ein Feld fester Länge; VARCHAR ist ein Feld variabler Länge. Wenn Sie Zeichenfolgen mit einer stark variablen Länge wie Namen speichern, verwenden Sie ein VARCHAR. Wenn die Länge immer gleich ist, verwenden Sie ein CHAR, da es etwas größeneffizienter und auch etwas schneller ist.


Ich würde zwar vermuten, dass die Behauptungen über Geschwindigkeit und Speichereffizienz hier wahr sind, aber keine von ihnen ist in irgendeiner Weise begründet (und es ist durchaus plausibel, dass sie falsch sind), was diese Antwort unbrauchbar macht. es wiederholt nur das, was der Leser wahrscheinlich schon erwartet hätte, ohne etwas zu tun, um es wirklich zu bestätigen.
Mark Amery

1

CHAR ist eine feste Länge und VARCHAR ist eine variable Länge. CHAR verwendet immer den gleichen Speicherplatz pro Eintrag, während VARCHAR nur den zum Speichern des tatsächlichen Texts erforderlichen Speicherplatz verwendet.


1

Das Zeichen ist ein Zeichendatentyp mit fester Länge, das Varchar ist ein Zeichendatentyp mit variabler Länge.

Da char ein Datentyp mit fester Länge ist, entspricht die Speichergröße des char-Werts der maximalen Größe für diese Spalte. Da varchar ein Datentyp mit variabler Länge ist, entspricht die Speichergröße des varchar-Werts der tatsächlichen Länge der eingegebenen Daten und nicht der maximalen Größe für diese Spalte.

Sie können char verwenden, wenn erwartet wird, dass die Dateneinträge in einer Spalte dieselbe Größe haben. Sie können varchar verwenden, wenn erwartet wird, dass die Dateneinträge in einer Spalte erheblich variieren.


0

laut High Performance MySQL- Buch:

VARCHAR speichert Zeichenfolgen variabler Länge und ist der am häufigsten verwendete Zeichenfolgendatentyp. Es kann weniger Speicherplatz als Typen mit fester Länge benötigen, da es nur so viel Speicherplatz benötigt, wie es benötigt (dh weniger Speicherplatz wird zum Speichern kürzerer Werte verwendet). Die Ausnahme ist eine mit ROW_FORMAT = FIXED erstellte MyISAM-Tabelle, die für jede Zeile einen festen Speicherplatz auf der Festplatte verwendet und somit Speicherplatz verschwenden kann. VARCHAR hilft Leistung, weil es Platz spart.

CHAR hat eine feste Länge: MySQL weist immer genügend Speicherplatz für die angegebene Anzahl von Zeichen zu. Beim Speichern eines CHAR-Werts entfernt MySQL alle nachgestellten Leerzeichen. (Dies galt auch für VARCHAR in MySQL 4.1 und älteren Versionen - CHAR und VAR CHAR waren logisch identisch und unterschieden sich nur im Speicherformat.) Die Werte werden nach Bedarf mit Leerzeichen aufgefüllt.


2
" VARCHAR hilft Leistung, weil es Platz spart " Es spart Platz, ja, aber wirkt es sich nicht negativ auf die Leistung aus? VARCHARmuss Speicher dynamisch nach Bedarf zuweisen, wodurch die Leistung im Gegensatz zu reduziert wird CHAR, oder?
Spikatrix

@ Spikatrix Kommt darauf an. Wenn VARCHAR-Werte häufig klein sind, aber bis zu N Byte betragen können, kann durch die dynamische Zuweisung eine erhebliche Menge an Speicherplatz und E / A eingespart werden, was für viele Daten leistungsfähiger ist. CHAR-Werte, deren Länge ungefähr gleich ist, wären leistungsfähiger. Lesen und Schreiben machen wahrscheinlich auch einen Unterschied.
Andrew

-4

Char hat eine feste Länge (unterstützt 2000 Zeichen), es steht für Zeichen ist ein Datentyp

Varchar hat eine variable Länge (unterstützt 4000 Zeichen)


-1; Diese Zahlen sind für MySQL nicht korrekt. (Ich denke, sie könnten für Oracle sein?)
Mark Amery

-5

Char oder varchar- wird verwendet, um Textdaten einzugeben, wobei die Länge in Klammern angegeben werden kann. Egname char (20)


Dies geht nicht auf die ursprüngliche Frage ein. OP fragt nach den praktischen Unterschieden zwischen den Typen, nicht nach der Syntax und dem Zweck der Typen. Auch (und )sind Klammern, keine Klammern.
2mac

@ 2mac Ihr letzter Satz gilt nur für amerikanisches Englisch; In Großbritannien nennen wir (und )Klammern, und viele Briten erkennen wahrscheinlich nicht einmal, dass es Dialekte des Englischen gibt, in denen sich das Wort "Klammer" auf ein Interpunktionszeichen beziehen kann. Es gibt ein starkes Argument dafür, "Klammern" gegenüber "Klammern" vorzuziehen - es ist wahrscheinlich insgesamt die maximal klare Option, wenn ein internationales Publikum von Programmierern angesprochen wird -, aber es ist ein komplizierterer Fall als "Klammern", die einfach falsch sind.
Mark Amery

-11

CHAR:

  • Unterstützt sowohl Zeichen als auch Zahlen.
  • Unterstützt 2000 Zeichen.
  • Feste Länge.

VARCHAR:

  • Unterstützt sowohl Zeichen als auch Zahlen.
  • Unterstützt 4000 Zeichen.
  • Variable Länge.

irgendwelche Kommentare......!!!!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.