如何修改MySQL表中列的大小?

319
我创建了一张表格,意外地将varchar的长度设为300而不是65353。我该如何修复它?请给出一个例子。
3个回答

602

你尝试过这个吗?

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

这将会把col_name的类型改成VARCHAR(65353)


18
这能保持数据完整吗? - Flimm
1
@Flimm 对我来说似乎没问题。 - deed02392
50
@Flimm - 只是一个提示,如果你将一个VARCHAR(100)的字段改为VARCHAR(50),它将从该列中删除任何现有数据。但对于这个特定问题,将列变大不会对数据造成影响。 - Warren Sergent
9
@WarrenSergent,在版本5.7.15中测试,如果更改影响到某些值,它将抛出错误。默认情况下不会截断。您需要使用SUBSTR事先更新这些值。 - Robert T.
1
@animo是正确的。看这里有完整的答案https://dev59.com/kGkw5IYBdhLWcg3w1eG7#9611293 - gontard
显示剩余3条评论

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

即使您不更改列名,也必须将列名列出两次。

请注意,在进行此更改后,列的数据类型将为MEDIUMTEXT


Miky D是正确的,MODIFY命令可以更简洁地完成此操作。


关于MEDIUMTEXT:MySQL行的最大大小为65535字节(不包括BLOB / TEXT列)。如果您试图将列更改为过大,使行的总大小为65536或更大,则可能会出现错误。如果您尝试声明一个VARCHAR(65536)列,则即使它是该表中唯一的列,它也太大了,因此MySQL会自动将其转换为MEDIUMTEXT数据类型。

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)

我误解了你最初的问题,你想要VARCHAR(65353),MySQL可以实现,只要该列大小与表中其他列的大小之和不超过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

+1 你们的答案一样。什么意思是列的数据类型将是MEDIUMTEXT?谢谢。 - vehomzzz
4
@Bill: CHANGE通常用于重命名列并修改其数据类型。MODIFY仅会更改列的数据类型。 - Mike Dinescu

0
ALTER TABLE {table_name} MODIFY [COLUMN] {column_name} {column_type} {defaults and/or not-null};

(包括COLUMN是可选的。)

注意:如果您的列是使用NOT NULL等创建的,则可能需要在MODIFY语句中指定它们,以避免丢失。


请在您的回答中添加更多细节,解释您的代码如何工作以及如何回答OP的问题,这不仅对提问者有帮助,也对未来的研究人员有帮助。 - Kuro Neko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接