Wie kann ich die Größe einer Spalte in einer MySQL-Tabelle ändern?


301

Ich habe eine Tabelle erstellt und versehentlich die varcharLänge als 300statt gesetzt 65353. Wie kann ich das beheben?

Ein Beispiel wäre willkommen.

Antworten:


571

Hast du das versucht?

ALTER TABLE <table_name> MODIFY <col_name> VARCHAR(65353);

Dadurch wird der Typ des Spaltennamens in geändertVARCHAR(65353)


14
Hält dies die Daten intakt?
Flimm

1
@Flimm scheint für mich.
deed02392

39
@Flimm - nur ein Zeiger, wenn Sie ein VARCHAR (100) haben und es in VARCHAR (50) ändern, werden alle vorhandenen Daten aus Spalten herausgeschnitten. Gemäß dieser speziellen Frage hat das Vergrößern einer Spalte jedoch kein Problem mit den Daten.
Warren Sergent

8
@WarrenSergent, getestet in 5.7.15, gibt einen Fehler aus, wenn Werte von der Änderung betroffen sind. Es wird standardmäßig nicht abgeschnitten. Sie müssen die Werte vorher mit einem SUBSTR aktualisieren.
Robert T.

1
@animo ist richtig. Schauen Sie sich dies für eine vollständige Antwort an stackoverflow.com/a/9611293/1594933
gontard

26
ALTER TABLE <tablename> CHANGE COLUMN <colname> <colname> VARCHAR(65536);

Sie müssen den Spaltennamen zweimal auflisten, auch wenn Sie seinen Namen nicht ändern.

Beachten Sie, dass nach dieser Änderung der Datentyp der Spalte lautet MEDIUMTEXT.


Miky D ist richtig, der MODIFYBefehl kann dies präziser machen.


Zum MEDIUMTEXTThema: Eine MySQL-Zeile kann nur 65535 Byte lang sein (ohne BLOB / TEXT-Spalten). Wenn Sie versuchen, eine Spalte so zu ändern, dass sie zu groß ist und die Gesamtgröße der Zeile 65536 oder höher beträgt, wird möglicherweise eine Fehlermeldung angezeigt. Wenn Sie versuchen, eine Spalte von zu deklarieren, VARCHAR(65536)ist sie zu groß, selbst wenn sie die einzige Spalte in dieser Tabelle ist. MySQL konvertiert sie daher automatisch in einen MEDIUMTEXTDatentyp.

mysql> create table foo (str varchar(300));
mysql> alter table foo modify str varchar(65536);
mysql> show create table foo;
CREATE TABLE `foo` (
  `str` mediumtext
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Ich habe Ihre ursprüngliche Frage, VARCHAR(65353)die MySQL ausführen kann, falsch verstanden , solange die mit den anderen Spalten in der Tabelle summierte Spaltengröße 65535 nicht überschreitet.

mysql> create table foo (str1 varchar(300), str2 varchar(300));
mysql> alter table foo modify str2 varchar(65353);
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

+1 Ihr habt die gleiche Antwort. Was bedeutet es, dass der Datentyp der Spalte MEDIUMTEXT ist? thx
vehomzzz

3
@Bill: CHANGE wird im Allgemeinen verwendet, um eine Spalte umzubenennen und ihren Datentyp zu ändern. MODIFY ändert nur den Datentyp der Spalte
Mike Dinescu
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.