sql里数据类型nchar(10)为什么能存10个汉字, char(10)只能存5个汉字?
2个回答
展开全部
这个得看你字符是按照什么样的编码规则
1、如果是单字节编码,举个例子ASCII,一个字符(准确来说是英文字符)是用一个字节编码的,而按照ASCII的拓展编码(具体是哪个编码规则忘了,不过可以统称ANSI),一个汉字是用两个字符表示,所以在此编码规则下,存放一个汉字(两个字符)需要两个字节,而char(10)中的10指的是字符个数,而不是多少字节(虽然在这种编码下得到的结果一样,因为一个字符对应一个字节,但是对于双字节编码的不是这样理解的),所以char(10)可以存10个字符,两个个字符表示一个汉字,所以最多存5个汉字。
2、如果是双字节编码,一个字符(这里的字符不仅仅包括英文字符,还包括中文字符即汉字,以及其他的字符)是用两个字节编码的,nchar()存储的是UNICODE字符,它是采用双字节编码规则,即一个字符相当于两个字节,但是nchar(10)其实不需要考虑到字节问题,这个10指的就是字符个数,在此规则下汉字和英文字符一样的性质,所以nchar(10)就能存10个汉字。
总结:发生这样的疑惑主要是,单字节编码没有把汉字等同于一般的字符例如英文字符,而是采用两个一般的字符来表示一个汉字,而双字节编码一视同仁,说到字符就是指所有字符,包括汉字。
1、如果是单字节编码,举个例子ASCII,一个字符(准确来说是英文字符)是用一个字节编码的,而按照ASCII的拓展编码(具体是哪个编码规则忘了,不过可以统称ANSI),一个汉字是用两个字符表示,所以在此编码规则下,存放一个汉字(两个字符)需要两个字节,而char(10)中的10指的是字符个数,而不是多少字节(虽然在这种编码下得到的结果一样,因为一个字符对应一个字节,但是对于双字节编码的不是这样理解的),所以char(10)可以存10个字符,两个个字符表示一个汉字,所以最多存5个汉字。
2、如果是双字节编码,一个字符(这里的字符不仅仅包括英文字符,还包括中文字符即汉字,以及其他的字符)是用两个字节编码的,nchar()存储的是UNICODE字符,它是采用双字节编码规则,即一个字符相当于两个字节,但是nchar(10)其实不需要考虑到字节问题,这个10指的就是字符个数,在此规则下汉字和英文字符一样的性质,所以nchar(10)就能存10个汉字。
总结:发生这样的疑惑主要是,单字节编码没有把汉字等同于一般的字符例如英文字符,而是采用两个一般的字符来表示一个汉字,而双字节编码一视同仁,说到字符就是指所有字符,包括汉字。
展开全部
char 和 varchar
固定长度 (char) 或可变长度 (varchar) 字符数据类型。
nchar
根据 unicode 标准所进行的定义,用给定整数代码返回 unicode 字符。
char是固定长度的字节,varchar是可变长度的字节,nchar是unicode编码的固定字符长度。
如:12345 在char(6)存储为123456加一个空格,共6个字节。
中国 在char(6)存储为中国加两个空格,共6个字节。
12345 在varchar(6)存储为123456,共5个字节。
中国 在varchar(6)存储为中国,共4个字节。
nchar(6)对汉字和半角字符处理时一样的,即可以存储6个汉字,也可以存储6个字母
固定长度 (char) 或可变长度 (varchar) 字符数据类型。
nchar
根据 unicode 标准所进行的定义,用给定整数代码返回 unicode 字符。
char是固定长度的字节,varchar是可变长度的字节,nchar是unicode编码的固定字符长度。
如:12345 在char(6)存储为123456加一个空格,共6个字节。
中国 在char(6)存储为中国加两个空格,共6个字节。
12345 在varchar(6)存储为123456,共5个字节。
中国 在varchar(6)存储为中国,共4个字节。
nchar(6)对汉字和半角字符处理时一样的,即可以存储6个汉字,也可以存储6个字母
追问
【nchar是unicode编码的固定字符长度。】这句是什么意思啊?
追答
nchar是unicode编码字符的。固定式相对 varchar和nvarchar说的。
unicode 用 2个字节来存储 任意个字符(不管是汉字还是半角字母、还是数字1、2、3、4)
而char是用ANSI编码方式来存储字符的,半角字母、数字的一个字符,只占1个字节;而GBK(汉字)的一个字符需要2个字节。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询