字符是如何被存儲的

在計算機中,所有數據都是用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個漢字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章