如果某一項中設置的是varchar(50)
那么對英文當然是50
那么對中文呢
utf-8的中文占3個字節
那么,這個varchar(50)是不是只能存16個漢字了?
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。
補充知識:
1.varchar類型的變化
MySQL 數據庫的varchar類型在4.1以下的版本中的最大長度限制為255,其數據范圍可以是0~255或1~255(根據不同版本數據庫來定)。在 MySQL5.0以上的版本中,varchar數據類型的長度支持到了65535,也就是說可以存放65532個字節的數據,起始位和結束位占去了3個字 節,也就是說,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的數據可以使用可變長的varchar來存放,這樣就能有效的減少數據庫文 件的大小。
MySQL 數據庫的varchar類型在4.1以下的版本中,nvarchar(存儲的是Unicode數據類型的字符)不管是一個字符還是一個漢字,都存為2個字 節 ,一般用作中文或者其他語言輸入,這樣不容易亂碼 ;varchar: 漢字是2個字節,其他字符存為1個字節 ,varchar適合輸入英文和數字。
4.0版本以下,varchar(20),指的是20字節,如果存放UTF8漢字時,只能存6個(每個漢字3字節) ;5.0版本以上,varchar(20),指的是20字符,無論存放的是數字、字母還是UTF8漢字(每個漢字3字節),都可以存放20個,最大大小是 65532字節 ;varchar(20)在Mysql4中最大也不過是20個字節,但是Mysql5根據編碼不同,存儲大小也不同,具體有以下規則:
a) 存儲限制
varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535。
新聞熱點
疑難解答