Gibt es einen Grund, varchar über Textspalten in einer Datenbank zu verwenden?

36

Ist varcharnur ein Überbleibsel aus der Zeit vor textkam um, oder gibt es Fälle verwenden , wo Sie würden wollen ein verwenden varchar? (Oder charfür diese Angelegenheit ..)

(Ich verwende täglich Postgres und MySQL (MyISAM). Das interessiert mich am meisten, aber Antworten für andere Datenbanken sind natürlich willkommen. ^ _-)

Izkata
quelle
6
Zumindest für SQL Server , textist veraltet. Es gibt auch Nutzungsüberlegungen, die sich darauf beziehen, wo die Daten gespeichert werden und wie auf sie zugegriffen wird.
Oded
In einigen DBMSs können Sie möglicherweise keine Textspalte in einer Sortier- oder Where-Klausel verwenden. Ich kenne mich mit Postgres nicht aus, überprüfe aber Ihre Unterlagen.
JQA
1
Diese StackOverflow-Frage enthält möglicherweise weitere Informationen.
20.

Antworten:

32

Im Allgemeinen

textSpalten sind nicht standard und implementierungsspezifisch. In vielen Fällen gelten je nach Datenbank eine oder mehrere der folgenden Einschränkungen: Nicht indizierbar , nicht durchsuchbar und nicht sortierbar .

In Postgres

Alle diese Typen werden intern mit derselben C-Datenstruktur gespeichert. .

In MySQL

Die textSpalte ist eine Spezialversion vonBLOB und unterliegt Indexeinschränkungen.

Nur diese beiden Beispiele können auf die anderen SQL RDBMS-Systeme hochgerechnet werden und sollten Grund genug sein, zu verstehen, wann ein Typ den anderen vorzuziehen ist.

Nur um es implizit zu verdeutlichen, sollten Sie es niemals verwenden, TEXTda es proprietär und nicht standardisiert ist. Jeder, den SQLSie dagegen schreiben, ist nicht portabel und wird Ihnen in Zukunft garantiert Probleme bereiten. Verwenden Sie nur Typen, die Teil des ANSI-Standards sind .

  • Verwenden CHARSie diese Option, wenn Sie wissen, dass Sie für jeden Eintrag eine feste Anzahl von Zeichen haben.
  • Verwenden VARCHARSie diese Option, wenn Sie für jeden Eintrag eine variable Anzahl von Zeichen haben.
  • Wenn Sie mehr Speicherplatz benötigen, als Sie VARCHARbereitstellen können, CLOBmit UTF-8Codierung oder gleichwertigem Standardtyp.
  • NIEMALS verwenden, TEXTda dies nicht dem Standard entspricht.

quelle
1
Akzeptiert für non standard and implementation specificund not indexable, not searchable and not sortable, was ich nicht realisiert habe. Ich hatte den Eindruck , text wurde standardisiert.
Izkata
1
meinst du den ASCII- textStandard oder den UNICODE- textStandard :-) oder einen der anderen ein halbes Dutzend textCodierungsstandards?
1
Wenn Sie die SQL-Standards-Dokumente durchgehen, werden Sie meines Erachtens nichts über texteinen Zeichentyp finden. Ich habe nichts gesehen, manche Anbieter nennen es long charund ähnliches, es ist im Grunde ein BLOB mit einer daran angehängten Codierung.
2
@JarrodRoberson um ehrlich zu sein, es gibt eine Menge seriöser Ressourcen, die (in Postgres-Umgebungen) "immer nutzen TEXT". Wenn Sie auf eine andere Datenbank migrieren, ist das kaum ein Deal Breaker, zumal Sie berücksichtigen müssen, dass postgres 'unbegrenzt VARCHAR(aufgrund von TOAST gibt es keine Zeilenbegrenzung wie zum Beispiel bei MySQL) möglicherweise nicht unbegrenzt VARCHARin übersetzen kann andere Datenbanken sowieso.
Kayaman
1
... und da Postgres CLOB nicht unterstützt , gilt der vorletzte Punkt nicht. Selbst wenn Sie den Standard einhalten, können Sie den Austausch von Ersatzteilen nicht unterstützen . Das Schreiben von ANSI-SQL ist in der realen Welt keine praktikable Option, es sei denn, Sie schreiben Toy-SQL.
Kayaman
11

text, varcharUnd charsind alle aus verschiedenen Gründen verwendet. Es gibt natürlich Implementierungsunterschiede (wie viel Größe sie einnehmen ... usw.), aber es gibt auch Verwendungs- und Vorsatzüberlegungen . Welche Art Sie verwenden, sagt Ihnen auch etwas über die Art der Daten aus, die darin gespeichert werden (oder wir würden sie alle textfür alles verwenden ). Wenn etwas eine feste Länge hat, verwenden wir char. Wenn es eine variable Länge mit einer genau definierten Obergrenze hat, verwenden Sie varchar. Wenn es sich um einen großen Textblock handelt, über den Sie nur wenig Kontrolle haben, ist textdies wahrscheinlich die beste Wahl.

System aus
quelle
3
Sooooooo, der einzige wirkliche Unterschied besteht darin, die Begrenzungsprüfung zu duplizieren, die wahrscheinlich sowieso im Programmcode enthalten sein sollte.
Izkata,
2
@Izkata - Es gibt auch Implementierungsunterschiede. Es geht nicht um die Überprüfung der Grenzen, es geht um Datentyp . Eine (US-) Postleitzahl ist immer eine 5-stellige Postleitzahl, daher wird die Verwendung von "char" Teil der Definition dieser Daten. Wenn es nur Dinge wie gebundenes Prüfen wären, könnten wir alle nur einen Datentyp für alles verwenden und unsere Prüf- und Casting-Code-Seite durchführen.
System Down
6
@SystemDown Soweit ich weiß, char, varchar, und textalle sind so konzipiert , das gleiche für die Speicherung Art von Daten. Bei beiden Antworten geht es also um die Überprüfung von Grenzen. Wenn es Effizienzunterschiede gibt, welche? Warum sollte ich varcharüber verwenden text?
Izkata
1
float und double werden auch für denselben Datentyp verwendet, weisen jedoch Unterschiede auf und werden unterschiedlich verwendet. In Bezug auf Implementierungsunterschiede bin ich mit Postgres nicht ausreichend vertraut, um zu antworten, dass ich Angst habe.
System Down
4
@SystemDown Obwohl das Speichern von Postleitzahlen als Zeichen (5) Sie beißen kann, wenn Sie mit der Internationalisierung beginnen. UK Postleitzahlen variieren in der Länge und 5 Zeichen ist fast nie genug. Ich weiß jedoch nicht, ob das Leerzeichen in einer britischen Postleitzahl für das Parsen relevant ist.
Vatine
5

Datenbanken beschäftigen sich intensiv mit der Leistung - Geschwindigkeit und der Minimierung des Speichers. In den meisten anderen Teilen der Computerwelt wird es Sie nicht stören, wie viele Zeichen sich in Ihrer Zeichenfolge befinden. es könnte einer sein, es könnte der gesamte Inhalt einer Enzyklopädie sein; Es ist alles nur eine Schnur. Tatsächlich stören Sie viele Sprachen nicht einmal, ob es sich um eine Zeichenfolge oder eine Zahl handelt.

Da Computer jedoch schneller werden und mehr Arbeitsspeicher gewinnen, speichern die Benutzer mehr Daten in ihren Datenbanken und führen anspruchsvollere Abfragen durch. Für eine Datenbank sind CPU und Arbeitsspeicher heute genauso begrenzt wie zu Zeiten von 64-KB-Hauptspeicher und 10-MB-Festplatten (auf Mainframe- Computern).

Eine feste Anzahl von Bytes ist viel einfacher zu handhaben als eine Zahl mit variabler Länge. 10 Bytes sind viel einfacher zu handhaben als 1.000.000. Ihre Datenbank möchte also, dass Sie ihm einen Hinweis geben, damit Sie ein Gigabyte an Ergebnissen aus Terrabyte an Daten in Mikrosekunden erhalten. Wenn Sie Ihre Datenbank nicht so intensiv nutzen, brauchen Sie nicht die Geschwindigkeit, die sie bietet, und ärgern sich über die unnötigen Fragen. Aber wenn Sie die Leistung brauchen, geben Sie ihr gerne einige Tipps.

Wie in den anderen Antworten erwähnt, Gebrauch charverwendet , wenn es immer eine bestimmte Anzahl von Zeichen, varcharwenn die Länge variieren kann , aber es ist nicht zu groß wird (meine Vermutung ist am DB behandelt es als einen charoder textje nach Größe), und textwenn es könnte beliebig lang sein. Wenn Ihr SQL versucht , eine zu verwenden , textSpalte, könnte es am besten sein , es irgendwie zu fassen und es in einer setzen charoder kleiner varcharSpalte auch dann tun where‚s und order by‘ auf , dass s. Natürlich nur, wenn Ihnen die Leistung wichtig ist.

RalphChapin
quelle