mysql5.1中utf8編碼下一個漢字佔用一個char的疑惑,mysql5.1utf8

來源:互聯網
上載者:User

mysql5.1中utf8編碼下一個漢字佔用一個char的疑惑,mysql5.1utf8
最近發現Oracle和MySQL的欄位長度的計算不一樣(都是UTF8編碼),比如:
在Oracle下定義:name varchar2(10) ,name欄位能存放:10個字元或3個漢字
在MySQL下定義:name varchar(10),name欄位能存放:10個字元或10個漢字
從上面可以得知:在oracle下,1個漢字=3個位元組
為什麼在 MySQL 下,1個漢字=1個位元組 呢??

經查,說:MySQL5 以後 varchar 的單位是字元了,而 oracle 的varchar2 是位元組 
編碼不一樣一個漢字佔用的位元組也不一樣:
UTF-8 下 1漢字=3位元組
GDK下 1漢字=2位元組

mysql varchar(50),不管中文還是英文都是存50個的。
MySQL5的文檔,其中對varchar欄位類型這樣描述:varchar(m) 變長字串。M 表示最大列長度。M的範圍是0到65,535。(VARCHAR的最大實際長度由最長的行的大小和使用的字元集確定,最大有效長度是65,532位元組)。
為何會這般變換?真是感覺MySQL的手冊做的太不友好了,因為你要仔細的繼續往下讀才會發現這段描述:MySQL 5.1遵從標準SQL規範,並且不刪除VARCHAR值的尾部空格。VARCHAR儲存時用一個位元組或兩個位元組長的首碼+資料。如果VARCHAR列聲明的長度大於255,長度首碼是兩個位元組。
好了,貌似懂了一點。但具體他說的長度大於255時使用2個位元組長度首碼,小學減法題:65535 - 2 = 65533啊。不知道這些大牛如何計算的,暫且保留疑問吧?

註:我測試了一下使用UTF8編碼,varchar的最大長度為21854位元組。
在mysql 5.0.45版本,資料庫編碼utf8下進行測試:varchar最長定義為21785。也就是說不論字母、數字、漢字,只能放21785個。

推想:varchar位元組最大65535,utf8編碼一個字元3個位元組65535/3=21785。但是用length函數取值的時候發現,一個漢字佔3個位元組,一個字母等字元佔用一個位元組。這個對於char(10)來說,是不是實際長度是不定的呢?

參考連結:
http://www.oschina.net/question/59889_12699
http://zhidao.baidu.com/question/132054814

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.