varchar (255) gegen tinytext / tinyblob und varchar (65535) gegen blob / text


91

Per Definition:

VARCHAR: Der Längenbereich beträgt 1 bis 255 Zeichen. VARCHAR-Werte werden sortiert und ohne Berücksichtigung der Groß- und Kleinschreibung verglichen, sofern nicht das Schlüsselwort BINARY angegeben wird. x + 1 Bytes
TINYBLOB, TINYTEXT: Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 255 (2 ^ 8 - 1) Zeichen x + 1 Bytes

Auf dieser Grundlage erstelle ich die folgende Tabelle:

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255),
  `lastname` tinytext,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Oder ist es besser, einen Varchar oder einen winzigen Text zu erstellen und warum ?

Ist es dasselbe für:

VARCHAR: Der Längenbereich beträgt> 255 Zeichen. VARCHAR-Werte werden sortiert und ohne Berücksichtigung der Groß- und Kleinschreibung verglichen, sofern nicht das Schlüsselwort BINARY angegeben wird. x + 2 Bytes
BLOB, TEXT Eine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 65535 (2 ^ 16 - 1) Zeichen x + 2 Bytes

Antworten:


159

VON: http://www.pythian.com/news/7129/text-vs-varchar/

Auf den ersten Blick sieht es so aus, als könnten TEXT und VARCHAR dieselben Informationen speichern. Es gibt jedoch grundlegende Unterschiede zwischen der Funktionsweise von TEXT-Feldern und VARCHAR-Feldern, die berücksichtigt werden müssen.

Standard VARCHAR ist tatsächlich Teil des ISO SQL: 2003-Standards. Die TEXT-Datentypen, einschließlich TINYTEXT, sind nicht Standard.

Speicher TEXT-Datentypen werden als separate Objekte von den Tabellen und Ergebnismengen gespeichert, die sie enthalten. Dieser Speicher ist transparent - es gibt keinen Unterschied darin, wie eine Abfrage mit einem TEXT-Feld geschrieben wird, im Vergleich zu einer Abfrage mit einem VARCHAR-Feld. Da TEXT nicht als Teil einer Zeile gespeichert wird, erfordert das Abrufen von TEXT-Feldern zusätzlichen [bearbeiteten 1/22] Speicheraufwand.

Maximale VARCHAR-Länge Die maximale Zeilenlänge eines VARCHAR wird durch die maximale Zeilenlänge einer Tabelle begrenzt. Dies sind 65.535 Bytes für die meisten Speicher-Engines (NDB hat einen anderen maximalen Zeilenwert). Theoretisch beträgt die maximale Länge eines VARCHAR 65.536 Bytes. Der Overhead begrenzt die tatsächliche maximale Größe eines VARCHAR weiter.

Das Speichern der Länge eines VARCHAR-Felds dauert 1 Byte, wenn das VARCHAR-Feld eine maximale Länge von 0 bis 255 Byte hat. Wenn es größer als 255 Bytes ist, beträgt der Overhead zum Speichern der Länge 2 Bytes. Wenn das Feld VARCHAR NULL-Werte zulässt, wird zusätzlicher Overhead hinzugefügt. Jede Tabelle verwendet 1 Byte Overhead für jeden Satz von 8 Feldern, die NULL-Werte zulassen. Wenn VARCHAR die einzige Zeile in der Tabelle ist und keine NULL-Werte zulässt, beträgt die maximal zulässige Länge für VARCHAR 65.532 Byte.

Beachten Sie, dass die Zahl in VARCHAR (x) die Anzahl der Zeichen und nicht die Anzahl der Bytes darstellt. Daher kann es schwierig sein, eine Tabelle nur mit VARCHAR (65532) zu definieren, wenn der Zeichensatz Mehrbytezeichen wie UTF-8 verwendet.

Wenn Sie versuchen, einen VARCHAR-Wert zu definieren, der länger als zulässig ist, wird ein Fehler wie 1118 oder 1074 angezeigt:

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs.

ERROR 1074 (42000): Column length too big for column 'col_name' (max=[max number here]); use BLOB or TEXT instead

Maximale TEXT-Länge Die maximale Größe eines TEXT-Datentyps hängt davon ab, welcher Typ des TEXT-Datentyps verwendet wird. Da sie als Objekte gespeichert sind, ist der einzige Zeilenaufwand im Tabellenobjekt ein Zeiger (8 oder 16 Byte). Hier ist eine Liste der maximalen TEXT-Länge und des Overheads (im TEXT-Objekt):

TINYTEXT  up to 255 bytes, 1 byte overhead

TEXT  up to 64 Kb, 2 bytes overhead

MEDIUMTEXT  up to 16 Mb, 3 bytes overhead

LONGTEXT  up to 4 Gb, 4 bytes overhead

STANDARD-Werte In MySQL dürfen TEXT-Datentypen keinen anderen Standardwert als NULL haben. VARCHAR-Felder dürfen mit einem DEFAULT-Wert erstellt werden.

Schlussfolgerungen Aufgrund der Auswirkungen auf den Speicher ist es vorzuziehen, VARCHAR anstelle von TINYTEXT zu verwenden.

Wenn Sie einen DEFAULT-Wert benötigen, der nicht NULL ist, müssen Sie VARCHAR (oder CHAR) verwenden.

Wenn Sie Zeichenfolgen länger als ca. 64 KB speichern müssen, verwenden Sie MEDIUMTEXT oder LONGTEXT. VARCHAR kann das Speichern so großer Werte nicht unterstützen.

Stellen Sie sicher, dass Sie die Auswirkungen eines Mehrbyte-Zeichensatzes kennen. VARCHAR (255) speichert 255 Zeichen, die mehr als 255 Byte umfassen können.


In Bezug auf "Die maximale Länge eines VARCHAR beträgt 65.536 Bytes" : Sind Sie sicher, dass es nicht tatsächlich 65.535 ist ?
Pacerier

@Pacerier Von MySQL: dev.mysql.com/doc/refman/5.0/en/char.html - Werte in VARCHAR-Spalten sind Zeichenfolgen variabler Länge. Die Länge kann als Wert zwischen 0 und 255 vor MySQL 5.0.3 und zwischen 0 und 65.535 in Version 5.0.3 und höher angegeben werden. Die effektive maximale Länge eines VARCHAR in MySQL 5.0.3 und höher hängt von der maximalen Zeilengröße (65.535 Byte, die von allen Spalten gemeinsam genutzt wird) und dem verwendeten Zeichensatz ab
Book Of Zeus

1
Dann sind es also 65.536.
Pacerier

1
1. Wenn die Länge von 0 bis 65535 angegeben werden kann, beträgt die maximale Länge 65535. 2. Die tatsächliche maximale Größe wird durch die Anzahl der Bytes und nicht durch Zeichen begrenzt. Abhängig von der Speicher-Engine kann ein VARCHAR (65535) vorangestellt werden mit zwei Bytes, die die tatsächliche Länge in Zeichen angeben, und einem Zeichensatz wie utf8 kann mehr als ein Byte pro Zeichen verwendet werden, wodurch die maximale Zeichenlänge noch kürzer wird.
Rsandwick3

Beachten Sie, dass die Verwendung von Kb, Mb und Gb im Auszug falsch ist und KiB, MiB und GiB sein sollte (wie in Kibibyten, nicht in Kilobit). Ref. [ dev.mysql.com/doc/refman/5.7/en/…
Splitlocked

10

In diesem Fall varcharist besser.

Beachten Sie, varchardass zwischen 1 und 65535 Zeichen liegen können.

Werte in VARCHAR-Spalten sind Zeichenfolgen variabler Länge. Die Länge kann als Wert zwischen 0 und 255 vor MySQL 5.0.3 und zwischen 0 und 65.535 in Version 5.0.3 und höher angegeben werden. Die effektive maximale Länge eines VARCHAR in MySQL 5.0.3 und höher hängt von der maximalen Zeilengröße (65.535 Byte, die von allen Spalten gemeinsam genutzt wird) und dem verwendeten Zeichensatz ab. Siehe Abschnitt E.7.4, „Grenzwerte für Tabellenspaltenanzahl und Zeilengröße“.

Blobs werden in einem separaten Abschnitt der Datei gespeichert.
Sie benötigen ein zusätzliches Fileread, um in die Daten aufgenommen zu werden.
Aus diesem Grund wird Varchar viel schneller abgerufen.

Wenn Sie einen großen Blob haben, auf den Sie selten zugreifen, ist ein Blob sinnvoller.
Durch das Speichern der Blob-Daten in einer separaten (Teil der) Datei kann Ihre Kerndatendatei kleiner werden und somit schneller abgerufen werden.


Ob dies besser ist oder nicht, hängt von Ihren Datenzugriffsmustern ab.
Michael Mior

1
Welche separate Datei könnte das sein?
glglgl

1
Blobs werden nicht in einer separaten Datei gespeichert. Sie werden jedoch an einem anderen physischen Ort als die übrigen Spalten gespeichert.
Michael Mior

1
Beachten Sie, dass dies nicht nur von der Häufigkeit des Zugriffs abhängt, sondern auch davon, welche Vorgänge mit den Daten ausgeführt werden. Beispielsweise wird jede Abfrage, die einen Tabellenscan erfordert (was im Allgemeinen ohnehin schlecht ist), jedoch nicht die Textspalte, durch das größere gescannte Datenvolumen verschlechtert.
Michael Mior

1
Ich vermute auch, dass Dateisorten, die diese Spalte nicht verwenden, effizienter sind, wenn die Daten außerhalb der Seite gespeichert werden, obwohl ich nicht sicher bin, ob der Abfrageoptimierer intelligent genug ist, um diese Daten nicht abzurufen.
Michael Mior
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.