MySQL VARCHAR字段最大长度到底是多少

MySQL Varchar 类型详解
本文详细介绍了 MySQL 中 varchar 类型的使用规则,包括不同版本中 n 的含义变化、受字符集影响的字节占用情况及最大长度限制,并通过实例展示了如何避免超出长度限制的问题。
  • varchar(n),n表示什么?

MySQL5.0.3之前varchar(n)这里的n表示字节数

MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个

 

  • n最大可以是多少

  • MySQL行长度

MySQL要求一个行定义长度不能超过65535个字节,不包括text、blob等大字段类型,varchar长度受此长度限制,和其他非大字段加起来不能超过65535个字节.

超过以上限制则会报错:

 

 

[sql]  view plain  copy
  1. drop table if EXISTS test1111;  
  2. create table test1111(  
  3.  id char(255) null,  
  4. content varchar(21830) null  
  5. )ENGINE=InnoDB DEFAULT CHARSET=utf8;  

 

 

 

[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

  •  varchar(n)占用几个字节

varchar(n)占用几个字节跟字符集有关系:

字符类型若为gbk,每个字符占用2个字节

字符类型若为utf8,每个字符最多占用3个字节

  • varchar最大长度可以是多少

根据字符集,字符类型若为gbk,每个字符占用2个字节,最大长度不能超过32766,字符类型若为utf8,每个字符最多占用3个字节,最大长度不能超过21845,若超过这个限制,则会自动将varchar类型转为mediumtext或longtext,例如:

 

[sql]  view plain  copy
  1. drop table if EXISTS test1111;  
  2. create table test1111(  
  3.  id char(255) null,  
  4. content varchar(63000) null  
  5. );  
  6. desc test1111;  
  7.   
  8. 结果:  
  9. CREATE TABLE `test1111` (  
  10.   `id` char(255) DEFAULT NULL,  
  11.   `content` mediumtext  
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

 



MySQL 中,如果你想修改一个字段的 `VARCHAR` 长度,可以使用 `ALTER TABLE` 语句配合 `MODIFY COLUMN` 或 `CHANGE COLUMN` 子句来实现。 ### ✅ 修改字段 VARCHAR 长度的语法: ```sql ALTER TABLE 表名 MODIFY COLUMN 字段VARCHAR(新的长度) [约束条件]; ``` 或者使用 `CHANGE COLUMN`(适用于需要同时改字段名的情况): ```sql ALTER TABLE 表名 CHANGE COLUMN 旧字段名 新字段VARCHAR(新的长度) [约束条件]; ``` > ⚠️ 注意:如果你不改变字段名,推荐使用 `MODIFY COLUMN`,更高效;如果要改名则用 `CHANGE COLUMN`。 --- ### 📌 示例 假设有一个表 `users`,结构如下: ```sql CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) ); ``` 现在你想把 `name` 字段从 `VARCHAR(50)` 改为 `VARCHAR(100)`: #### 使用 MODIFY COLUMN(推荐): ```sql ALTER TABLE users MODIFY COLUMN name VARCHAR(100) NOT NULL; ``` > 🔁 注意:必须重新指定该字段原有的约束(如 `NOT NULL`),否则可能会丢失! --- ### 💡 扩展说明 - **增加长度**:比如从 `VARCHAR(50)` → `VARCHAR(255)` 是安全的,不会丢失数据。 - **减少长度**:比如从 `VARCHAR(255)` → `VARCHAR(10)`,如果已有数据超过 10 个字符,MySQL 会报错或截断(取决于 SQL 模式)。 - 建议先检查最大数据长度: ```sql SELECT MAX(CHAR_LENGTH(name)) FROM users; ``` - **字符集影响存储**: - `VARCHAR(N)` 的 N 是字符数,不是字节数。 - 在 `utf8mb4` 字符集下,每个字符最多占 4 字节,所以 `VARCHAR(255)` 最多占用 255×4 = 1020 字节。 - InnoDB 表行大小有限制(约 65,535 字节),因此 `VARCHAR` 总和不能太大。 --- ### ✅ 安全操作建议流程 ```sql -- 1. 查看当前字段定义 DESCRIBE users; -- 2. 查询当前字段中最长的数据长度 SELECT MAX(CHAR_LENGTH(name)) AS max_len FROM users; -- 3. 修改字段长度(确保新长度大于等于当前最长值) ALTER TABLE users MODIFY COLUMN name VARCHAR(100) NOT NULL; -- 4. 再次确认修改成功 DESCRIBE users; ``` --- ### ❗常见错误 - 错误提示:`Data too long for column 'name'` - 原因:试图缩小长度但存在超长数据。 - 解决方案:先清理或迁移数据,再修改。 - 忘记添加 `NOT NULL` 等约束导致约束丢失。 --- ### ✅ 使用 CHANGE COLUMN(改名+改长度) ```sql ALTER TABLE users CHANGE COLUMN name full_name VARCHAR(100) NOT NULL; ``` 这会将字段名从 `name` 改为 `full_name`,同时修改长度和保留 `NOT NULL`。 --- ### 总结 | 场景 | 推荐语句 | |------|----------| | 只改长度 | `MODIFY COLUMN` | | 改名 + 改长度 | `CHANGE COLUMN` | | 缩短长度前 | 先检查数据长度 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值