忽然看到字符汉字特殊字符在计算机中的存储方式

普及字符是如何被存储的。在计算机中,所有数据都是用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个汉字。

感觉别人说的很详细,就存一下

原文地址:https://www.cnblogs.com/searchbaidu/p/6526678.html