MySQL CHAR VARCHAR 字段长度

本文详细介绍了MySQL中CHAR和VARCHAR类型字段的定义、最大字符限制、存储空间占用及表字段长度限制,帮助开发者更好地理解和使用这两种数据类型。

参见 https://dev.mysql.com/doc/refman/5.6/en/char.html
以上是针对MySQL 5.6版本,不保证之前的版本也有同样的行为。

总结一下:

  • 建表时定义的CHAR(n)和VARCHAR(n)是指定该字段能储存的最大字符(而不是字节)。既然是字符,当然不同字符集会占用不同的存储空间,如果是字符集是latin1,1个字符对应1个字节,如果字符集是utf8,则一个字符对应3个字节,以此类推。
  • CHAR类型的字段可指定长度为0-255。
  • VARCHAR类型的字段可指定长度为0-65535。
  • 整个表的CHAR/VARCHAR字段长度之和不能超过65535字节。
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` | | 缩短长度前 | 先检查数据长度 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值