char(1)和varchar(1)的区别

区别就是char是定长,varchar是变长。


@xman_78tom

varchar(1) 相对 char(1) 不但没有优势,还会拖累性能。

在存储上, varchar 类型需要 2 个字节的额外空间来跟踪存储字符串的长度,这样 varchar(1) 实际占用的是 3 个字节。因此,varchar(1) 要比 char(1) 占用更大的空间,在同等环境下便可能消耗更多的 i/o。这个应该是 varchar 类型的优势,但对 varchar(1) 确实劣势。

在性能上,SQL Server 在处理 char 类型上也要比处理 varchar 快一点(如,某些 update 操作,对 char 类型便是占位更新,而对 varchar 便会造成分页)。这一点网上有很多论述。


@libinlink

选用原则:一般都用varchar,用char需求一变化就要改啦。。。。。


@xys_777

程序判断上稍有区别
当用户输入A,提交后,又删除A,提交后,varchar(1)是空字符串(oracle中不存在空字符串)
char(1)是1个空格

create table ttt(char1 char(1),varchar1 varchar(1))
 
insert ttt select'A','A'
update ttt set char1='',varchar1=''
 
select ascii(char1),ascii(varchar1) from ttt
 
----------- ----------- 
32          NULL
 
(所影响的行数为 1 行)

@aitcax

在Mysql中测试,得到结果是:

CREATE TABLE 't_user'(
`char1` CHAR(1) NULL DEFAULT NULL,
`varchar1` VARCHAR(1) NULL DEFAULT NULL
)

update t_user set char1='' ,varchar1='' where u_id=1;
select ascii(char1),ascii(varchar1) from t_user where u_id=1;

mysql> select ascii(char1),ascii(varchar1) from t_user where u_id=1;
+--------------+-----------------+
| ascii(char1) | ascii(varchar1) |
+--------------+-----------------+
|            0 |               0 |
+--------------+-----------------+
可以看到在mysql中,得到的结果都是空字符串,ascii(0)表示空。

附:ascii码特殊字符意义

ASCII 表各特殊字符代表的意义_百度文库



<think>我们正在讨论MySQL中CHARVARCHAR数据类型的区别。根据提供的引用,我们可以总结如下:1.存储机制:-CHAR类型是固定长度的,即一旦定义,无论实际存储的数据长度是多少,都会占用定义时指定的固定空间。例如,CHAR(10)将始终占用10个字符的存储空间(不足部分用空格填充)。-VARCHAR类型是可变长度的,它只占用实际存储数据所需的长度加上1个或2个字节(用于记录数据长度)。例如,VARCHAR(10)存储字符串"abc"将占用3个字符的存储空间(假设使用单字节字符集)加上记录长度的额外字节。2.性能差异:-由于CHAR是固定长度,所以查询时速度可能会稍快,特别是当存储的数据长度恰好接近定义长度时。但是,如果存储的数据长度变化较大,可能会浪费存储空间。-VARCHAR节省存储空间,尤其是在存储的数据长度变化较大的情况下。但是,由于可变长度的特性,在更新数据时可能会导致额外的开销(例如行迁移),特别是在数据长度发生改变时,可能会导致行链接或行迁移,从而影响I/O性能。3.使用场景:-CHAR适合存储长度基本固定的数据,例如定长代码(如国家代码、MD5值等)或者短字符串(如性别、状态标志等)。-VARCHAR适合存储长度变化较大的数据,如用户姓名、地址、电子邮件等。4.其他注意事项:-在MySQL中,对于CHAR类型,如果存储的数据末尾有空格,在检索时会被自动去掉(除非修改SQL模式)。而VARCHAR则会保留这些空格。-在索引方面,CHAR类型由于其固定长度,索引效率可能更高;而VARCHAR类型由于长度可变,可能会在某些情况下影响索引性能,但一般情况下,如果使用得当,差别不大。为了更清晰,我们可以通过以下示例来展示:```sql--创建使用CHAR类型的表CREATETABLEchar_table(idINT,country_codeCHAR(2)--用于存储两个字母的国家代码);--创建使用VARCHAR类型的表CREATETABLEvarchar_table(idINT,emailVARCHAR(100)--用于存储长度可变的电子邮件地址);```在插入数据时:```sqlINSERTINTOchar_table(id,country_code)VALUES(1,'US');--实际存储固定占用2字符INSERTINTOvarchar_table(id,email)VALUES(1,'user@example.com');--实际存储长度为字符串长度+1(或2)个字节```总结:根据实际需求选择合适的数据类型。如果数据长度固定或变化很小,使用CHAR;如果数据长度变化大,使用VARCHAR以节省空间。§§相关问题§§1.在MySQL中,CHARVARCHAR的最大长度限制是多少?2.如何选择使用CHAR还是VARCHAR?3.行迁移是什么?在什么情况下会发生?4.MySQL的SQL模式对CHARVARCHAR的存储检索有什么影响?</think> ### MySQL中CHARVARCHAR数据类型的区别分析 #### 1. **存储机制** - **CHAR类型**:固定长度存储 - 始终占用定义的字节数 - 例如`CHAR(10)`存储`"abc"`:占用10字节(剩余空间用空格填充)[^1][^4] - **VARCHAR类型**:可变长度存储 - 仅占用实际数据长度 + 长度标识(1-2字节) - 例如`VARCHAR(50)`存储`"john@example.com"`:占用16字节(15字符 + 1长度标识)[^2][^5] $$存储空间公式:VARCHAR = \text{实际长度} + \text{长度标识字节}$$ #### 2. **性能差异** | 指标 | CHAR | VARCHAR | |---------------|--------------------------|--------------------------| | 读取速度 | 更快(无需解析长度) | 较慢(需读长度标识) | | 更新效率 | 稳定(长度固定) | 可能导致行迁移[^3] | | 存储空间 | 浪费空余空间 | 节省空间 | > **行迁移现象**:当VARCHAR列频繁修改且长度变化时,数据页会重新定位,增加I/O负担[^3] #### 3. **使用场景对比** ```sql -- 适用CHAR的场景(长度固定) CREATE TABLE user_status ( id INT, status CHAR(2) -- 如'ON','OFF' ); -- 适用VARCHAR的场景(长度可变) CREATE TABLE user_profile ( id INT, email VARCHAR(100) -- 邮箱长度不一 ); ``` - **CHAR推荐**:国家代码(CN/US)、MD5值、固定长度编码[^4] - **VARCHAR推荐**:用户名、地址、文本描述[^5] #### 4. **特殊行为** - **空格处理**: CHAR存储时自动填充空格,检索时去除尾部空格;VARCHAR保留所有空格[^1] - **索引效率**: CHAR的固定长度特性可使索引更紧凑,范围查询更快[^4]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值