A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓建军 中级黑马   /  2013-3-30 21:51  /  1513 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邓建军 于 2013-3-31 10:46 编辑

在SQL数据类型中,char,nchar,varchar,nvarchar之间有什么区别,什么时间用哪个数据类型?非UNICODE英文字母占一个字节,其他占2个字节UNICODE中英文字母占几个字节,其他字符占几个字节 ?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

6 个回复

倒序浏览
char,varchar类型是非unicode类型,一般用于存储英文字符,占1个字节;nchar,nvarchar类型是unicode类型,一般用于存储非英文格式的字符,占一个字符。
char,nchar是长度固定的类型,如果输入的内容长度不够,则自动用空格补齐长度,所以,如果长度过长(比如超过10个字节)建议使用varchar,nvarchar
varchar,nvarchar是变长类型,会根据用户的输入自动缩减占用的空间,但对于数据长度比较短的字段(少于10个字节)的建议使用char,nchar  

总之,char,nchar效率高,但浪费内存;varchar,nvarchar省内存,但效率不高。英文用char ,varchar,中文用nvarchar,nchar

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
可以参考http://www.cnblogs.com/mekong/archive/2009/04/17/1437996.html
回复 使用道具 举报
哇!确实是大家的迷惑之处
回复 使用道具 举报
第一个区别是char、varchar , 前者是固定长度后者是可变长度:当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度,而varchar,nvarchar变长字符数据则不会以空格填充。打个比方:你把kill 这个数据方到char(10)这种格式的定义里,你取出来的数据长度就为10, 因为其他6个为空格填充的;而如果是放到varchar(10)里取出来的仍然是4这个长度。

第二个区别是unicode和非unicode:数据库中,英文字符只需要一个字节存储,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符。

对于存储的规格:
char,varchar        最多8000个英文,4000个汉字
nchar,nvarchar        可存储4000个字符,无论英文还是汉字

CHAR
CHAR存储定长数据很方便,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
VARCHAR
存储变长数据,但存储效率没有CHAR高,如果一个字段可能的值是不固定长度的,可以定义为varchar,VARCHAR类型的实际长度是它的值的实际长度+1。这一个字节用于保存实际使用了多大的长度。
回复 使用道具 举报
要什么时候用这个很好区别: 比如你一个字段上规定性别 只有男女,那最好就是char  , 比如说address这个字段你不确定有多长可以使用varchar(100)
如果数据里只有英文没有别的语言你可以使用char、varchar , 但如果有中文或者是其他的语言,为了避免乱码的问题, 就可以使用带有unicode这种编码的方式了
回复 使用道具 举报
实际开发中应该都用nvarchar,可变长度字符串。
char、vchar占用固定长度,在无法预测长度的情况下,如果长度超出字段定义,数据库会报截断字符串异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马