区别就是char是定长,varchar是变长。
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 便会造成分页)。这一点网上有很多论述。
选用原则:一般都用varchar,用char需求一变化就要改啦。。。。。
程序判断上稍有区别
当用户输入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码特殊字符意义