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

veh*_*zzz 295 mysql database alter-table

我创建了一个表,并意外地将varchar长度300代替65353.我该如何解决这个问题?

一个例子将不胜感激.

Mik*_*scu 558

你试过这个吗?

ALTER TABLE <table_name> MODIFY <col_name> VARCHAR(65353);
Run Code Online (Sandbox Code Playgroud)

这会将col_name的类型更改为VARCHAR(65353)

  • @Flimm - 只是一个指针,如果你有一个VARCHAR(100)并将它改为VARCHAR(50),它将从列中删除任何现有数据.但是,根据这个具体问题,将列放大不会导致数据出现问题. (37认同)
  • 这是否保持数据完整? (14认同)
  • @WarrenSergent,在5.7.15中测试,如果有值受变化影响,则会抛出错误.默认情况下不会截断.您必须事先使用SUBSTR更新值. (8认同)

Bil*_*win 25

ALTER TABLE <tablename> CHANGE COLUMN <colname> <colname> VARCHAR(65536);
Run Code Online (Sandbox Code Playgroud)

您必须列出两次列名,即使您没有更改其名称.

请注意,进行此更改后,列的数据类型将为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)
Run Code Online (Sandbox Code Playgroud)

我误解了你想要的原始问题,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
Run Code Online (Sandbox Code Playgroud)

  • @Bill:CHANGE通常用于重命名列并更改其数据类型.MODIFY只会更改列的数据类型 (3认同)