MySQL中varchar與char區別


一. varchar存儲規則:  

  4.0版本以下,varchar(20),指的是20字節,如果存放UTF-8漢字時,只能存6個(每個漢字3字節)  

  5.0版本以上,varchar(20),指的是20字符,無論存放的是數字、字母還是UTF-8漢字(每個漢字3字節),都可以存放20個字符 Mysql4中最大也不過是20個字節,但是Mysql5根據編碼不同,存儲大小也不同。  

二. varchar和char 的區別:  

  區別1:定長和變長

     char 表示定長,長度固定,varchar表示變長,即長度可變。當所插入的字符串超出它們的長度時,視情況來處理,如果是嚴格模式,則會拒絕插入並提示錯誤信息,如果是寬松模式,則會截取然后插入。如果插入的字符串長度小於定義長度時,則會以不同的方式來處理,如char(10),表示存儲的是10個字符,無論你插入的是多少,都是10個,如果少於10個,則用空格填滿。而varchar(10),小於10個的話,則插入多少個字符就存多少個。

   區別:2:存儲的容量不同  

    對 char 來說,最多能存放的字符個數 255,和編碼無關。 而 varchar 呢,最多能存放 65532 個字符。VARCHAR 的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是 65,532(65535-3=65532  減1的原因是實際行存儲從第二個字節開始’;  減2的原因是varchar頭部的2個字節表示長度;)字節          

    在MySQL中用來判斷是否需要進行對據列類型轉換的規則  :     

    1、在一個數據表里,如果每一個數據列的長度都是固定的,那么每一個數據行(一條數據)的長度也將是固定的.        

     2、只要數據表里有一個數據列(一個字段)的長度的可變的,那么各數據行的長度都是可變的.          

    3、如果某個數據表里的數據行的長度是可變的,那么,為了節約存儲空間,MySQL會把這個數據表里的固定長度類型的數據列轉換為相應的可變長度類型.例外:長度小於4個字符的char數據列不會被轉換varchar類型

 三. MySQL中varchar最大長度是多少?  

  這不是一個固定的數字。先簡要說明一下限制規則。      

    字段的限制在字段定義的時候有以下規則:        

      a) 存儲限制        

       varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最 大長度不能超過65535字符。               b) 編碼長度限制        

       字符類型若為gbk,每個字符最多占2個字節,最大長度不能超過32766;                  

       字符類型若為utf8,每個字符最多占3個字節,最大長度不能超過21845。          

       若定義的時候超過上述限制,則varchar字段會被強行轉為text類型,並產生warning。        

     c) 行長度限制          

      導致實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535bytes。若定義的表長度超過這個值,則提示        

       ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。          

      由字符集來確定,字符集分單字節和多字節        

      Latin1 一個字符占一個字節,最多能存放 65532 個字符        

      GBK 一個字符占兩個字節, 最多能存 32766 個字符        

       UTF8 一個字符占三個字節, 最多能存 21844 個字符        

    注意,char 和 varchar 后面的長度表示的是字符的個數,而不是字節數。    

  舉兩個例說明一下實際長度的計算。        

      a) 若一個表只有一個varchar類型,如定義為          

      create table t4(c varchar(N)) charset=gbk;          

      則此處N的最大值為(65535-1-2)/2= 32766 個字符。          

      減1的原因是實際行存儲從第二個字節開始’;        

        減2的原因是varchar頭部的2個字節表示長度;        

         除2的原因是字符編碼是gbk。          

     b) 若一個表定義為          

      create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;          

      則此處N的最大值為 (65535-1-2-4-30*3)/3=21812          

      減1和減2與上例相同;          

      減4的原因是int類型的c占4個字節;        

        減30*3的原因是char(30)占用90個字節,編碼是utf8。        

         如果被varchar超過上述的b規則,被強轉成text類型,則每個字段占用定義長度為11字節,當然這已經不是“varchar”了。        

         則此處N的最大值為 (65535-1-2-4-30*3)/3=21812        

      create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

      

 

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM