mysql 5.7 新特性中在线in-place 修改字段的大小
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,VARCHAR 字段的大小能够通过 ALTER TABLE,命令,以in-place 的方式修改, 例如 :ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUM
千家信息网最后更新 2025年11月08日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安全错误
数据库的锁怎样保障安全
小学网络安全主题班会通讯报道
远程服务器和本地数据库链接
求生之路服务器
延边学习网络技术
于nosql数据库的是
云数据库 存储过程
哪个学校专科软件开发
湖南数据库空投箱出厂价格
网络安全设备配置情况
关于网络安全的手抄报写的内容
软件开发桌面指纹仪好不好
手机邮件无法安全连接服务器
什么样的软件开发人才
做好网络安全产业
网络技术世界详解
网络安全与执法怎么就业
国际服的服务器维护到几点钟
网络安全需要态势感
分布式数据库采购技术要求
万方数据库的创建时间
为什么战网登录不了服务器
全网软件开发
河北本地软件开发市场报价
合肥互联网金融科技公司
计算网络技术考试试卷
视频服务器双网卡
java数据库优化方法
净化之时的数据库
ebu 数据库
移动软件开发近期现状