2009-10-20 7 views
16

Wenn ich eine Spalte in der Tabelle mit Feld vom Typ VARCHAR(15) und wenn ich versuche, 16 Daten der Länge einzufügen, gibt MySQL einen FehlerMySQL VARCHAR Größenbeschränkung

Data too long for column 'testname' at row 1 

Weiß jemand, warum VARCHAR-Felder in MySQL unter Angabe feste Länge nehmen? Wie viele Bytes dauert ein VARCHAR-Feld pro Datensatz basierend auf der angegebenen Größe?

+4

@Camilo - Fake es, bis Sie es schaffen! – Ben

Antwort

13

Wenn Sie eine Spalte auf varchar(15) setzen, ist die maximale Anzahl zulässiger Bytes 15. Sie können also nicht mehr als 15 Zeichen übergeben, ohne die Spalte so zu ändern, dass sie mehr als 15 unterstützt. Wenn Sie eine 4-stellige Zeichenfolge speichern, sollte dies nur der Fall sein Verwenden Sie ungefähr 4 Bytes von möglichen 15, während Sie, wenn Sie char(15) verwendet hätten, die anderen 11 mit leeren Bytes ausgefüllt hätten.

http://dev.mysql.com/doc/refman/5.0/en/char.html

(Meine war Byte Berechnung wahrscheinlich ab, da es immer -1/+ 1 oder so ähnlich).

+0

Danke. Gut in meinem Fall bin ich wirklich unsicher, was die Länge der Daten kommen wird. Es könnte lang sein oder könnte auch klein sein. genauer gesagt: Wenn ich Spalte als Varchar (100) angegeben habe, dann können die Daten 100 Zeichen oder 50 Zeichen lang sein. Nur um mein Verständnis zu verdeutlichen. Meinst du, es wird nur als Datentyp CHAR fungieren. Ich meine, wird es volle 100 Bytes für jeden Datensatz oder nur 50 Bytes eingefügt.Auch in anderen RDBMS Wenn ich nicht VARCHAR Grenze angeben oder sogar nach specifeinlimit erlaubt es mir mehr Zeichen als das einfügen. Ist es in MYSQL möglich. –

+0

Wenn Sie es auf 'varchar (100)' setzen und Ihre Zeilendaten 50 Zeichen haben, dann wird nur die Hälfte davon verbraucht, es wirkt * nicht * als 'char', das die restlichen Bytes füllt. –

+0

Danke, aber es ist nicht möglich, insert mehr als 100 Bytes in Varchar (100) -Spalte. Entschuldigung für die gleiche Frage immer wieder. Aber ich möchte sehr sicher sein, bevor ich irgendeine Größe auf die Spalte setze. Danke nochmal. –

1

Wenn Sie hier soll es dir alles erzählt über varchar Sie wissen wollen: http://dev.mysql.com/doc/refman/5.0/en/char.html

Grundsätzlich abhängig von der Länge wählen Sie sie 1 oder zwei Bytes verwenden, um die Länge der aktuellen Zeichenfolge zu verfolgen in Diese Spalte speichert also die Anzahl der Bytes für die Daten, die Sie eingeben, plus ein oder zwei Bytes.

Also, wenn Sie 'abc' eingeben, dann werden 4 oder 5 Bytes für diese Spalte in dieser Zeile verwendet.

Wenn Sie char(15) verwendet haben, dann würde auch 'abc' 15 Bytes belegen, da die Daten die richtige aufgefüllt werden, um die vollen 15 Bytes zu belegen.

+0

Hallo James, Was meinst du mit Daten ist richtig gepolstert? Ich meine auch, dass selbst wenn ich 10 Zeichen in der varchar (15) Spalte eingegeben habe, dies ganze 15 Bytes für 10 Zeichen benötigt, so wie es das Zeichen (15) braucht. –

+0

Nein, die richtige Auffüllung ist für Char, nicht Varchar. –

13

Vom MySQL 5.0 Manual:

Werte in VARCHAR-Spalten sind Zeichenfolgen variabler Länge. Die Länge kann als ein Wert von 0 bis 255 vor MySQL 5.0.3 und von 0 bis 65.535 in 5.0.3 und höheren Versionen 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.

Ich verwende nur VARCHAR, wenn ich bestimmte bin, dass die Daten der Spalte zu halten, braucht nie eine bestimmte Länge nicht überschreiten, und selbst dann vorsichtig ich bin. Wenn ich eine Textzeichenfolge speichere, neige ich dazu, einen der TEXT-Typen zu verwenden.

Überprüfen Sie die MySQL Storage Requirements für weitere Informationen darüber, wie die Bytes verwendet werden.

3

Kleine zusätzliche lokale Note. Die Anzahl der verwendeten Bytes hängt vom verwendeten Codierungsschema ab. 1 Byte pro Zeichen in Latin1-Codierung, aber bis zu 3 in UTF8. Siehe Link in Mlambie's Antwort für Details.

+0

Danke. ja. Ich werde UTF-8 verwenden, SO wird es Doppel-Byte dauern. –