mysql 5.7 新特性中在线in-place 修改字段的大小
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,VARCHAR 字段的大小能够通过 ALTER TABLE,命令,以in-place 的方式修改, 例如 :ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUM
千家信息网最后更新 2026年11月01日mysql 5.7 新特性中在线in-place 修改字段的大小VARCHAR 字段的大小能够通过 ALTER TABLE,命令,以in-place 的方式修改, 例如 :
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
This is true as long as the number of length bytes required by a VARCHAR column remains the same.只要修改字段后字段varchar所占字节数和原先的相同就能实现,例如对于 VARCHAR 值在 0到 255,只需要一个bytes. 对于 VARCHAR 的值是 256 bytes 或者大于256 需要两个字节.这样的话,通过 in-place ALTER TABLE 只支持0到255 之间的修改,或者说256 以及大于256之间修改.in-place alter table 不支持小于256的varchar值变更为大于256的值。因为在这种情况下存储的字节会从1个字节变为两个字节。只能通algorithm=copy的方式修改,例如将varchar (255)的值修改到256 in-place alter would 会返回一个错误
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change
column type INPLACE. Try ALGORITHM=COPY.
这里需要着重说明的一点是需要针对不同的字符集来对应如果是英文 0-255 随便修改如果是其它字符集那么就需要注意了因为不同字符集占存储位不同这里拿中文做演示。
CREATE TABLE `t1` (
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into t1 values ('hu')
commit;
mysql> ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN name name VARCHAR(100);
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql> ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN name name VARCHAR(86);
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql>
mysql> ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN name name VARCHAR(85);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改为100和86 就报错修改为85就没问题 官方文档不是说0-255 只要存储的比特没变就可以吗? 为啥这里不行呢?
其实官方文档是对的! 因为英文没错,但是换成其他字符集的话 存储占位不同。
一个中文字符集占位UTF8 是三个bit
85*3=255 所以修改为85 可以修改为86 就超过了255 了只能通过copy 的方式了。
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
This is true as long as the number of length bytes required by a VARCHAR column remains the same.只要修改字段后字段varchar所占字节数和原先的相同就能实现,例如对于 VARCHAR 值在 0到 255,只需要一个bytes. 对于 VARCHAR 的值是 256 bytes 或者大于256 需要两个字节.这样的话,通过 in-place ALTER TABLE 只支持0到255 之间的修改,或者说256 以及大于256之间修改.in-place alter table 不支持小于256的varchar值变更为大于256的值。因为在这种情况下存储的字节会从1个字节变为两个字节。只能通algorithm=copy的方式修改,例如将varchar (255)的值修改到256 in-place alter would 会返回一个错误
ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change
column type INPLACE. Try ALGORITHM=COPY.
这里需要着重说明的一点是需要针对不同的字符集来对应如果是英文 0-255 随便修改如果是其它字符集那么就需要注意了因为不同字符集占存储位不同这里拿中文做演示。
CREATE TABLE `t1` (
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into t1 values ('hu')
commit;
mysql> ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN name name VARCHAR(100);
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql> ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN name name VARCHAR(86);
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql>
mysql> ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN name name VARCHAR(85);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
修改为100和86 就报错修改为85就没问题 官方文档不是说0-255 只要存储的比特没变就可以吗? 为啥这里不行呢?
其实官方文档是对的! 因为英文没错,但是换成其他字符集的话 存储占位不同。
一个中文字符集占位UTF8 是三个bit
85*3=255 所以修改为85 可以修改为86 就超过了255 了只能通过copy 的方式了。
字符
字符集
字节
不同
存储
字段
方式
两个
之间
官方
文档
中文
英文
支持
大小
不行
相同
这样的话
三个
命令
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
什么是科技互联网
喔噻互联网科技有限公司
互联网核心科技是什么
互联网巨头反垄断金融科技
互联网 科技
为想互联网科技
互联网科技汛
互联网 科技服务平台
上海电发互联网科技有限公司
温州喔噻互联网科技有限公司
广州恒生互联网科技有限
岳阳华臻互联网科技有限公司
未来五年的互联网科技
搜狐科技互联网
允成互联网科技有限公司融资
翼展科技 首家互联网医院
陕西云淼互联网科技公司
郑州欣桑互联网科技有限公司
互联网科技新闻
陕西九四连强互联网科技有限公司
耶加雪菲
互联网科技海报
互联网通讯科技
猫创互联网科技
重庆科技学院互联网
开启互联网科技时代小说
成都铂石互联网科技做什么的
搜狐科技互联网
互联网安防科技感
伍佰万互联网科技是干嘛的