MySQL|什么情况下拓展字段长度会锁表?

作为产品DBA,经常被开发问,修改字段长度锁表吗?然后凭借"经验"给出回答:如果字段长度超过256个字符就会锁表。

现在看来回答错误 。看看MySQL 官方文档

Extending VARCHAR column size

The number of length bytes(字节) required by a VARCHAR column must remain the same. For VARCHAR columns of 0 to 255 bytes in size, one length byte is required to encode the value.

For VARCHAR columns of 256 bytes in size or more, two length bytes are required. As a result, in-place ALTER TABLE only supports increasing VARCHAR column size from 0 to 255 bytes, or from 256 bytes to a greater size. In-place ALTER TABLE does not support increasing the size of a VARCHAR column from less than 256 bytes to a size equal to or greater than 256 bytes. In this case, the number of required length bytes changes from 1 to 2, which is only supported by a table copy (ALGORITHM=COPY).

翻译上面的意思

  1. 字符串的字段是以字节为单位存储的,utf8 一个字符需要三个字节,utf8mb4 一个字符需要4个字节。对于小于等于255字节以内的长度可以使用一个byte 存储。大于255个字节的长度则需要使用2个byte存储。
  2. online ddl  in-place 模式(不锁表)只支持字段的字节长度从0到255之间 或者256到更大值之间变化。
  3. 如果修改字段的长度,导致字段的字节长度无法使用 1 byte表示,得使用2个byte才能表示,比如从 240 修改为 256 ,如果在默认字符集为utf8mb4的情况下,varchar(60) 修改为 varchar(64),则DDL需要以copy模式,也即会锁表,阻塞写操作。

另外就是不支持以 in-place 方式缩小字段长度。

Decreasing VARCHAR size using in-place ALTER TABLE is not supported. Decreasing VARCHAR size requires a table copy (ALGORITHM=COPY).

实践出真知
t1 表的字符集为utf8mb4,初始字段长度为20 ,80个字节,可以使用1byte表示。分别修改字符串长度为 60--->64--->128。当字段的字节数变动 跨越了256 则会锁表。

-----------------------------------
©著作权归作者所有:来自51CTO博客作者mob604756fe27f4的原创作品,请联系作者获取转载授权,否则将追究法律责任
MySQL|什么情况下拓展字段长度会锁表?
https://blog.51cto.com/u_15127645/2777868

为了深入理解MySQL数据的创建与操作,我们首先需要掌握一些基础知识。《掌握MySQL基础:SQL语句练习1详解》将为你提供详尽的练习材料和实际代码示例,通过这些内容,你将能够独立完成数据的创建和数据的操作。 参考资源链接:[掌握MySQL基础:SQL语句练习1详解](https://wenku.csdn.net/doc/4dgquqpdne?spm=1055.2569.3001.10343) 首先,我们来创建一个包含三个字段的数据。以下是一个基本的示例,假设我们需要创建一个名为 `employees` 的,其中包含员工的ID、姓名和部门: ```sql CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, department VARCHAR(50) ); ``` 在这个SQL语句中,我们定义了三个字段:`id` 为整型,并设置为自动增长,作为主键;`name` 为可变长度字符串,最大长度为50个字符,且不允许为空;`department` 为可变长度字符串,最大长度为50个字符。 接下来,我们向 `employees` 中插入数据: ```sql INSERT INTO employees (name, department) VALUES ('张三', '销售部'); ``` 查询数据时,如果我们想获取所有员工的信息,可以执行: ```sql SELECT * FROM employees; ``` 若要更新特定员工的部门信息,可以使用: ```sql UPDATE employees SET department = '市场部' WHERE name = '张三'; ``` 最后,如果需要删除某个员工的信息,可以使用: ```sql DELETE FROM employees WHERE name = '张三'; ``` 在进行数据操作时,请确保在真实数据库环境中使用这些SQL语句之前,已经创建了相应的数据库,并且已经选择了正确的数据库。这些操作性的练习将帮助你更好地理解和掌握MySQL数据库的基本操作,为以后进行更复杂的数据操作打下基础。 为了帮助你进一步巩固和拓展所学知识,建议在完成基础操作后,深入学习《掌握MySQL基础:SQL语句练习1详解》中关于数据排序、分组、联合查询、事务处理、索引使用、权限管理以及存储过程和函数等内容。这些高级特性能够让你更灵活地处理数据,并优化数据库性能。 参考资源链接:[掌握MySQL基础:SQL语句练习1详解](https://wenku.csdn.net/doc/4dgquqpdne?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值