Jak mogę zmienić rozmiar kolumny w tabeli mysql?

301

Utworzyłem stół i przypadkowo podałem varchardługość 300zamiast 65353. Jak mogę to naprawić?

Przykład byłby mile widziany.

pojazd
źródło

Odpowiedzi:

571

Próbowałeś tego?

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

Spowoduje to zmianę typu col_name naVARCHAR(65353)

Mike Dinescu
źródło
14
Czy to utrzymuje dane nienaruszone?
Flimm
1
@Flimm wydaje mi się.
deed02392,
39
@Flimm - tylko wskaźnik, jeśli masz VARCHAR (100) i zmienisz go na VARCHAR (50), wycina on wszelkie istniejące dane z kolumn. Jednak zgodnie z tym konkretnym pytaniem powiększenie kolumny nie spowoduje problemów z danymi.
Warren Sergent
8
@WarrenSergent, przetestowany w 5.7.15, zgłosi błąd, jeśli zmiana wpłynie na wartości. Domyślnie nie zostanie obcięty. Będziesz musiał wcześniej zaktualizować wartości za pomocą SUBSTR.
Robert T.
1
@animo ma rację. Spójrz na to, aby uzyskać pełną odpowiedź stackoverflow.com/a/9611293/1594933
gontard
26
ALTER TABLE <tablename> CHANGE COLUMN <colname> <colname> VARCHAR(65536);

Musisz dwukrotnie wymienić nazwę kolumny, nawet jeśli nie zmieniasz jej nazwy.

Pamiętaj, że po wprowadzeniu tej zmiany typ danych kolumny będzie MEDIUMTEXT.


Miky D ma rację, MODIFYpolecenie może to zrobić bardziej zwięźle.


Chodzi o to MEDIUMTEXT, że wiersz MySQL może mieć tylko 65535 bajtów (nie licząc kolumn BLOB / TEXT). Jeśli spróbujesz zmienić kolumnę na zbyt dużą, co spowoduje, że całkowity rozmiar wiersza 65536 lub większy, może wystąpić błąd. Jeśli spróbujesz zadeklarować kolumnę VARCHAR(65536), jest ona zbyt duża, nawet jeśli jest to jedyna kolumna w tej tabeli, więc MySQL automatycznie konwertuje ją na MEDIUMTEXTtyp danych.

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)

Źle odczytałem twoje oryginalne pytanie, które chcesz VARCHAR(65353), co MySQL może zrobić, o ile rozmiar kolumny zsumowany z innymi kolumnami w tabeli nie przekracza 65535.

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
Bill Karwin
źródło
+1, wy macie taką samą odpowiedź. co to znaczy, że typ danych kolumny to MEDIUMTEXT? thx
Vehomzzz
3
@Bill: ZMIANA służy zwykle do zmiany nazwy kolumny i zmiany jej typu danych. MODIFY zmieni tylko typ danych kolumny
Mike Dinescu