mysql 5.7 新特性中在线in-place 修改字段的大小
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,VARCHAR 字段的大小能够通过 ALTER TABLE,命令,以in-place 的方式修改, 例如 :ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUM
千家信息网最后更新 2024年09月22日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安全错误
数据库的锁怎样保障安全
支持中华文化数据库建设是
计算机网络技术知识点第二版
海淀区技术软件开发服务供应
顺义区网络技术服务需求
一体化机柜服务器
数据库表简介
数据库行之间关系是什么约束
开发区运行服务器
河南郑州新郑服务器云主机
sap为什么不能导数据库
ipad网络安全检测关闭
新浪服务器地址
内蒙古高校线上宣传网络安全知识
宝山区视频系统服务器
国内工业网络安全事件
数据库软件课程设计考试管理系统
网络安全检测工作流程
数据库的时间格式为
一站网网络技术有限公司
超视网络技术
饥荒怎么看服务器历史
软件测试和网络安全题库
网络技术应用试题库
数据库中事务
qt5软件开发总结
怀旧服部落人多的PVE 服务器
ajax查询数据库数据返回
电脑怎样做软件开发
北京软件开发商名录
能够实现数据库多表关联