MySQL中char與varchar區別,varchar最大長度是多少?


一、首先來說下字符字節的區別:

字符與字節它們完全不是一個位面的概念,所以兩者之間沒有“區別”這一說法。在不同編碼里,字符和字節的對應關系是不同的。一般來說,半角英文狀態下一個字母或數字(稱之為字符)占用一個字節,一個漢字用兩個字節表示。在不同的編碼方式下一個字符占的字節數是不同的,所以兩者是不能划等號的。

  1. 1個字節(Byte)等於8個bit位,每個bit位是0/1兩種狀態,也就是說一個字節可以表示256個狀態,計算機里用字節來作為最基本的存儲單位。

  2. 字符,在計算機和電信技術中,一個字符是一個單位的字形、類字形單位或符號的基本信息。

  3. 字符是指計算機中使用的字母、數字、字和符號,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。

    ①ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。一個二進制數字序列,在計算機中作為一個數字單元,一般為8位二進制數,換算為十進制。最小值0,最大值255。

    ②UTF-8編碼中,一個英文字符等於一個字節,一個中文(含繁體)等於三個字節。

    ③Unicode編碼中,一個英文等於兩個字節,一個中文(含繁體)等於兩個字節。

    文本符號:英文標點占一個字節,中文標點占兩個字節。舉例:英文句號“.”占1個字節的大小,中文句號“。”占2個字節的大小。

    ④UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。

    ⑤UTF-32編碼中,世界上任何字符的存儲都需要4個字節。

二、varchar和char 的區別:

  char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是: char(M)類型的數據列里,每個值都占用M個字節,如果某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列里,每個值只占用剛好夠用的字節再加上一個用來記錄其長度的字節(即總長度為L+1字節).

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

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

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

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

在mysql中,char和varchar都表示字符串類型.但他們存儲和檢索數據的方式並不相同.

在表結構定義中聲明char和varchar類型時,必須指定字符串的長度.也就是該列所能存儲多少個字符(不是字節,是字符).例如:char(10)和varchar(10)都能存儲10個字符.

聲明為char的列長度是固定的,char的長度可選范圍在0-255之間.也就是char最大能存儲255個字符.如果該列是utf8編碼,則該列所占用的字節數=字符數*3.如果是gbk編碼則該列所占用的字節數=字符數*2.

聲明為varchar的列長度是可變的,在mysql5.0.3之前varchar的長度范圍為0-255,mysql5.0.3之后varchar的長度范圍為0-65535個字節.采用varchar類型存儲數據需要1-2個字節(長度超過255時需要2個字節)來存儲字符串的實際長度.如果該列的編碼為gbk,每個字符最多占用2個字節,最大長度不能超過32766個字符.如果該列的編碼為utf8,每個字符最多占3個字節,最大字符長度為21845.

總結:

 ① char和varchar最大的不同就是一個是固定長度,一個是可變長度.由於是可變長度,因此存儲的是實際字符串再加上一個記錄字符串長度的字節。如果分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.

 ②varchar(M)和char(M),M都表示字符數.varchar的最大長度為65535個字節,不同的編碼所對應的最大可存儲的字符數不同.char最多可以存放255個字符,不同的編碼最大可用字節數不同.

length()與char_length()

length():Return the length of a string in bytes.返回字符串所占的字節數(受編碼影響).

char_length():Return number of characters in argument.返回字符串中的字符數.

 

test:

1.建表

create table t_char_test(
id int(11) primary key,
name_char char(10) ,
name_varchar varchar(10) 
)engine=Myisam default charset=utf8;

insert into t_char_test(id,name_char,name_varchar) values (0,'字符類型','字符類型');

結果集如下:

 

3、varchar最大長度是多少?

varchar存儲規則:

  4.0版本以下,varchar(20),指的是20字節,如果存放UTF8漢字時,只能存6個(每個漢字3字節)
5.0版本以上,varchar(20),指的是20字符,無論存放的是數字、字母還是UTF8漢字(每個漢字3字節),都可以存放20個,最大大小是65532字節 
Mysql4中最大也不過是20個字節,但是Mysql5根據編碼不同,存儲大小也不同。

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

  1、限制規則

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

  a) 存儲限制

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

  b) 編碼長度限制

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

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

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

  c) 行長度限制

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

  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。

  2、計算例子

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

  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

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

  varchar(30)和char(30)最多能存放:

  工在基工左基工在基順工作奔大規模集成電路城工作東奔西走左奪工城韉革城載模壓地工魂牽夢縈栽土木工程魂牽夢縈栽植奇巧魂牽夢縈地廳城柑模壓東奔西走苦村落模壓革革柑可耕地村模壓基栽魂牽夢基

  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

  111111111111111111111111111111111111111111111111111111

  111111111111111111111111111111111111

http://www.educity.cn/wenda/596225.html


免責聲明!

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



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