Mysql中varchar和char區別


一、varchar和char的區別:

區別一:定長和變長

char表示定長、長度固定,varchanr表示變長,即長度可變。

  • 即char類型是規定多少字長則必須存儲多少字長,超過的長度的字段則只能截取出對應的長度進行存儲,相對於要求字長長度不夠的字段則用空格補齊。
  • 而varchar類型則是只要在規定字長之內,有多少存多少,無需補齊;超出的部分和char一樣,舍去即可。(由perfix來實現)

區別二:存儲容量不同

  • 對於char類型來說,最多只能存放的字符個數為255,和編碼無關。
  • varchar最多能存放65532個字符。VARCHAR的最大有效長度由最大行大小和使用的字符集來確定。整體最大長度是65,532字節。

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

  1. 在一個數據列表里,如果每個數據列的長度都是固定的,那么每個數據列的寬度也是固定的。
  2. 只要數據列表里有一個數據列的長度可變,那么個數據列的長度都是可變的。
  3. 如果某個數據表里的某個數據行的長度是可變的,那么為了節約時間,Mysql會把這個數據庫里的固定長度類型轉換為可變長度類型。但是長度小於4的char類型不會轉換為varchar類型。

三、 Mysql中varchar的最大長度為多少?(這不是一個固定的數字)

1. 限制規則

    • 存儲限制
      • varchar字段是將實際內容存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535字符。
    • 編碼長度限制
      • 字符類型若為gbk,每個字符最多占2個字節,最大長度不能超過32766;
      • 字符類型若為UTF8,每個字符最多占3字節,最大長度不能超過21845;
      • 若定義的時候超過上述限制,則varchar會被強制轉換為text類型,並產生warning。
    • 行長度限制
      • 導致實際運用中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 后面的長度表示的是字符的個數,而不是字節數。

         

2. 計算例子

      • 若一個表只有一個varchar類型。其定義為
      • create table t4(c varchar(N)) charset=gbk; 則此處N的最大值為(65535-1-2)/2=32766個字符。
        • 減1的原因是實際行存儲從第二個字節開始;
        • 減2的原因是varchar頭部的兩個字節表示長度;
        • 除2的原因是字符編碼是gbk
      若一個表定義為

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;則此處的最大值為(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