常听说一个汉字占两个字节,为什么会占两个字节,英文单词怎么存储?
普及字符是如何被存储的。在计算机中,所有数据都是用0和1这样的位来描述。一个字节有8位,因此一个字节最多可以描述256个字符。在欧美国家,比如美国,他们的文字字符主要就是26个字母加上一些特殊符号(+-*/等),用一个字节就可以存储,一个国家使用的所有字符就是一个code page,用一个字节存储字符的code page 叫做single-byte code page。但是在亚洲的一些国家,比如中国,常用汉字有几万个,根本不能用一个字节来表示所有的汉字字符,因此需要用两个字节描述。因为两个字节有16位,最多可以描述65536个字符,足够用来描述所有汉语字符以及常用字符,这些字符也是一个code page,不过是double-byte code page,主要针对的是中国。每个国家都有一个code page来对应所使用的字符。比如欧美国家,他们使用拉丁,虽然a-z这26个字母所对应的二进制在code page中是相同的,但是在重音('é'和'á')方面是不相同的。所以如果code page不同,那么相同的二进制代码所表示出来的字符也可能不相同。如果数据在不同code page的计算机上传输,就需要进行code page的转换,如果接收方的code page上没有定义传输方传送过来的特定字符的二进制位,那么就会出现数据丢失。
上面讲到的这些都是同一个概念,那就是数据库中的collation。正如我们前面提到的,每一个国家可能都有自己的collation,这样的话在信息传输上会非常不方面,涉及到collation转换更是烦上加烦。那么用什么方法解决了。这个时候就出现了unicode。unicode是一个大字符表,将全世界上的所有字符都存在一个2字节的字符表中,并且全世界所有国家字符在字符表上都能找到唯一对应的标号。这样的一个好处就是我们使用了同意的字符表,就不要转换了。坏处是,想abc这样的字符,也要占用两个字节,而不是原来的一个自己。
那么在sqlserver如何表现是unicode,在sqlservr中引入了nvarchar和nchar。比如nchar(10),这样的一个结构最多可以存储10个汉字,也最多只能存储10个英文字母。但是所占用的字节就是20字节。而加入是char(10)的话,没有使用unicode,那么就可以存储10个英文字母,但是最多只能存储5个汉字。
赞啊!我只知道一个汉字字符占用两个字节,一个英语字符占用一个字节,没想到这位仁兄知道的这么详细。
@lanyefeng2008: 工作中刚好碰到,所以查了一些资料。
汉字比那个英文字母多太多了。1个字节 255个 根本不够放
经测试,sqlserver中nvarchar(n),n的数等于存汉字的数等于存字母的数,也就是我说:"今天好热啊啊",nvarchar(6)就能存到,而英文只能存"weather",可见存一句中文大概才能存一个单词.不知道对不对,望知道的分析哈.
因此一个字节最多可以描述256个字符 这是什么意思