中文在gb2312編碼的時候是2位元組,但在unicode編碼的 情況下是1-3位元組不等,英文則都是1位元組,但在mysql中不做這方面的設定,varchar的長度不管是中文和英文都是一格字算一個,那麼。。為什麼要做這個1個漢字相當於2個英文字元的設定?
回複內容:
中文在gb2312編碼的時候是2位元組,但在unicode編碼的 情況下是1-3位元組不等,英文則都是1位元組,但在mysql中不做這方面的設定,varchar的長度不管是中文和英文都是一格字算一個,那麼。。為什麼要做這個1個漢字相當於2個英文字元的設定?
http://xfhnever.com/blog/2014/12/20/encodingformat/ 中稍微介紹了一下各種編碼格式
varchar(20)指定的是字元長度
mysql中會指定表的字元集,如下面的CHARSET=gbk:
CREATE TABLE `test_type` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`),) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=gbk COLLATE=gbk_bin
為什麼要做這個1個漢字相當於2個英文字元的設定?
這種設定是一般基於字串的自然長度(也就是顯示的長度), 一個漢字等於2個英文字母或數字。對於普通使用者來講就是字樣,計算位元組一般不都是程式和程式員乾的事麼。所以一般的程式設計中,一般遵循著一個漢字就是2個英文字母長度的設定,而具體佔用空間則視編碼和環境進行計算。
參建函數 mb_strwidth()
最早出現的編碼是ASCII這樣面向英文語言的編碼,ASCII定義了0-127,一共128個字元的編碼。對於英語這樣用26個字元的,自然是夠用的。問題是,如果是其他使用的字元多餘26個的西方文字呢?由於已經約定了0x7F空間內的字元編碼,所以我們可以看到有些西方文字,例如俄文是完全不和英文共用部分字元的,需要使用ASCII擴充集。在編碼理論發展的過程,出現過各個地區分別採用不同編碼體系來編碼本國文字。中國是使用ISO2022體系,編碼了中國的常用字元GB2312,更多的字元GBK,以及最大的集合GB18030。
通過簡單的思考,你會發覺一個位元組8bits只能編碼類別似英文這樣的文字系統,而中文的常用字就有幾千上萬個。所以至少需要2個位元組。
Unicode的出現,目的是統一全世界所有的字元編碼空間,不會造成字元編碼衝突問題。例如,如果你用GBK編碼的字元,用UTF-8編碼解釋,也可能是字面有效。Unicode編碼有UTF-8,UTF-16,UTF-32,甚至UTF-7等多種格式。常說的Unicode編碼是指UTF-16,因為它能以統一的方式編碼幾乎所有常用的字元,所以如果不是針對極端情況,我們可以假設字元都能用UTF-16表示。在UTF-16編碼的情況下,漢字和英文每個字元的長度都是2個位元組,是等長的。在Windows系統內部就是利用這種特性,高效的處理文字。UTF-8應用也很廣泛,好處是儲存上來說空間節省,解碼複雜些。
MySQL在多個層面上都做了Encoding的設計,支援在不同層面上指定字元編碼。
不過顯然,我們應該推薦在各個層面是使用UTF-8編碼。如果是記憶體中處理,推薦使用UTF-16,其實各種語言在設計中,好像也是這樣設計的。