Maison >base de données >tutoriel mysql >请认真对待数据库中的char 与varchar
做完学生管理系统的那会,发现一个问题。用户名后加了几个空有时候照样可以登录系统,这可是我们想要的。下面就这个问题说下char与varchar的区别吧 先说下他们的工作方式 Char 是固定长度的字符型,varchar是可变长度的字符。举个例子,比如设定两个字段 Car
做完学生管理系统的那会,发现一个问题。用户名后加了几个空格有时候照样可以登录系统,这可是我们想要的。下面就这个问题说下char与varchar的区别吧
先说下他们的工作方式
Char 是固定长度的字符型,varchar是可变长度的字符。举个例子,比如设定两个字段
CardID char(10), StuID varchar(10).当给这连个字段插入数据时,
输入数据 |
char类型的字段内容 |
varchar类型的字段内容 |
aaa |
aaa (aaa后面还有7个空格) |
aaa (aaa后面没有空格) |
aaabbb |
aaabbb |
aaabbb |
aaabbbcccccc |
出错,将截断字符串或二进制数据 |
出错,将截断字符串或二进制数据 |
由上表可以看出,对于char类型的数据来会所,如果添加的自如长度不够,sql 自动用空格补齐,而varchar则不会自动补齐空格。
也就是说char类型的数据长度 = 定义的长度,而varchar类型的数据长度
char类型,固定字长,效率高,但是会比varchar多占用空间;varchar类型,可变字长,节省空间,但是效率比char稍差。
由于他们的特性,决定了他们的而是用情况
char使用回避varchar多谢,我们不是太却空间,而且效率会提高我们的产品的认可率。这就是数据库设计中常用到的“以空间换效率”
此外, varchar 虽然比char节省空间,但是如果一个varchar列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象(Oracle中较为明显),而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar效果会更好一些。
但是用char时要时刻注意空格问题。由于char会自动补齐空格,所以在输入数据长度小于定义的最大长度时,输入"a" 和输入"a "是一样的。因为它们最终后面会补齐空格而变成相同的内容。假如该列有主键约束或者唯一性约束,那么就会发生错误,因为违反了“实体完整性”约束。当然如果没有这些约束,同样也会出现错误。就拿我们刚做的机房收费系统的登录模块来说吧,如果把密码定义成了char类型,那么把设定密码为“admin ”,而我用“admin”可以顺利登录,这显然不是用户想看到的。追求效率是对的,但是前提是保证其正确性。所以我认为一些特定的必须要用varchar,比如密码。