一:
1個漢字 = 1個字 = 1個字符
二:
1個字符 = 1個字節 = 8bit(ACSII碼下)
三:
1個字符 = 2個字節 = 16bit(Unicode碼下)
以前一直使用oracle11g,一個漢字占3個字節,所以在操作MySQL時也一直這樣分配長度。
今天測試了下mysql發現不對了
可以看到第一個的長度確實是15,但是第二個為什么是5?
在網上找到資料:char_length計算的是字符長度,而length計算的是字節長度,剛好我使用的是utf8,一個漢字占3個字節,占一個字符。
那好了,應該是對的上了,可是好奇心我就試了下
為什么這是相同的?因為這不是漢字,一個字母一個字符一個字節。
好了,現在知道原來mysql和Oracle一樣的,但是又看到一篇說mysql的varchar與oracle的varchar2是不一樣的,前者是用字符做單位的,后者是用字節做單位的。對於oracle11g的varchar2是用字節做單位的在以前玩oracle時測試過,但是mysql就沒有測試過,好吧現在測試下。我先將字段長度改小看下能不能給容下,測試結果確實是可以的,證明mysql的varchar是用字符做單位的,這里就不貼圖了,大家可以自己驗證下。
總結:oracle 中varchar2(10) 既10個字節3個漢字
mysql 中varchar(10) 既10個字符10個漢字
所以現在可以將mysql的varchar字段減小1/3了,性能也能提高哦。
問題1:一個中文字符用utf-8編碼占用幾個字節,gbk,gb2312,還有iso8859-1呢?
答案1:常用中文字符用utf-8編碼占用3個字節(大約2萬多字),
但超大字符集中的更大多數漢字要占4個字節(在unicode編碼體系中,U+20000開始有5萬多漢字)。
GBK、GB2312收編的漢字占2個字節,嚴格地用iso8859-1無法表示漢字,只能轉為問號。
漢字一個字占兩個字節。英文字母一個字母占一個字節