mysql基礎(8)_列型別之字串型【一】
字串型
Char
定長字元:指定長度之後,系統一定會分配指定的空間用於儲存資料.超過的長度的欄位則只能截取出對應的長度進行儲存,相對於要求字長長度不夠的欄位則用空格補齊。
基本語法:char(L),L代表字元數(中文與英文字母一樣),L長度為0到255
Varchar
變長字元:指定長度之後,系統會根據實際儲存的資料來計算長度,分配合適的長度(資料沒有超出長度).規定字長之內,有多少存多少,無需補齊;超出的部分和char一樣,截取出對應的長度進行儲存。
基本語法:Varchar(L),L代表字元數,L的長度理論值為0到65535,因起始位和結束位佔去了2-3個位元組,所以其整體最大長度為65532-65533位元組
因為varchar要記錄資料長度(系統根據資料長度自動分配空間),所以每個varchar資料產生後,系統都會在資料後面增加1-2個位元組的額外開銷,是用來儲存資料所佔用的空間長度,如果資料本身小於127個字元,額外開銷一個位元組;如果大於127個,就開銷兩個位元組。
注意:char 和 varchar 後面的長度表示字元不是位元組數。
比如:定義一個char[10]和varchar[10],如果存進去的是‘csdn’,那麼char所佔的長度依然為10,除了字元‘csdn’外,後面跟六個空格,而varchar就立馬把長度變為4了,取資料的時候,char型別的要用trim()去掉多餘的空格,而varchar是不需要的。儘管如此,char的存取數度還是要比varchar要快得多,因為其長度固定,方便程式的儲存與查詢;但是char也為此付出的是空間的代價,因為其長度固定,所以難免會有多餘的空格佔位符佔據空間,可謂是以空間換取時間效率,而varchar是以空間效率為首位的。
儲存資料 | char(2) | varchar(2) | char所佔位元組 | varchar所佔位元組 |
A | A | A | 2*3=6 | 1*3+1=4 |
AB | AB | AB | 2*3=6 | 2*3+1=7 |
char和varchar的特點:
varchar:
1、使用比固定長度型別(char)佔用更少儲存空間(除了使用ROW_FORMAT=FIXED建立的MyISAM表)。
2、使用額外的1-2位元組來儲存值長度,列長度<=255使用1位元組儲存,其它情況使用2位元組儲存。例如varchar(10)會佔用11位元組儲存空間,varchar(500)會佔用502位元組儲存空間。
4、5.0以上版本,取值或設定值都會儲存字串末尾的空格,4.1之前的版本都會把字串末尾的空格刪除掉。
5、最大長度遠大於平均長度,很少發生更新的時候適合使用varchar,因為碎片更少了。
char:
1、使用固定長度。
2、儲存的時候會去掉字串末尾的空格。
3、適合儲存MD5後的雜湊值或經常改變的值,因為固定的行不容易產生碎片。
mysql> desc char_data;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | char(3) | YES | | NULL | |
| address | varchar(20) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
mysql> insert into char_data values(' 張三',' 北京市');
Query OK, 1 row affected (1.71 sec)
mysql> insert into char_data values('李四 ','南京市 ');
Query OK, 1 row affected (0.00 sec)
mysql> insert into char_data values('王 五','上海 市');
Query OK, 1 row affected (0.00 sec)
mysql> select * from char_data;
+-------+---------+
| name | address |
+-------+---------+
| 張三 | 北京市 |
| 李四 | 南京市 |
| 王 五 | 上海 市 |
+-------+---------+
3 rows in set (0.00 sec)
mysql> select concat("'",name,"'") from char_data;
+----------------------+
| concat("'",name,"'") |
+----------------------+
| ' 張三' |
| '李四' |
| '王 五' |
+----------------------+
3 rows in set (1.56 sec)
mysql> select concat("'",address,"'") from char_data;
+-------------------------+
| concat("'",address,"'") |
+-------------------------+
| ' 北京市' |
| '南京市 ' |
| '上海 市' |
+-------------------------+
3 rows in set (0.00 sec)
char和varchar的區別:
1、char一定會使用指定的空間,varchar是根據資料來定空間。
2、char的資料查詢效率比varchar高,varchar是需要通過後面的記錄數來計算儲存長度,會浪費精力,而char是不需要的
適用情況:
1、對於MyISAM表,儘量使用Char,對於那些經常需要修改而容易形成碎片的myisam和isam資料表就更是如此,它的缺點就是佔用磁碟空間;
2、對於InnoDB表,因為它的資料行內部儲存格式對固定長度的資料行和可變長度的資料行不加區分(所有資料行共用一個表頭部分,這個標頭部分存放著指向各有關資料列的指標),所以使用char型別不見得會比使用varchar型別好。事實上,因為char型別通常要比varchar型別佔用更多的空間,所以從減少空間佔用量和減少磁碟i/o的角度,使用varchar型別反而更有利;
3、儲存很短的資訊,比如門牌號碼101,201……這樣很短的資訊應該用char,因為varchar還要佔個byte用於儲存資訊長度,本來打算節約儲存的現在得不償失。
4、固定長度的。比如使用uuid作為主鍵,那用char應該更合適。因為他固定長度,varchar動態根據長度的特性就消失了,而且還要佔個長度資訊。
5、十分頻繁改變的column。因為varchar每次儲存都要有額外的計算,得到長度等工作,如果一個非常頻繁改變的,那就要有很多的精力用於計算,而這些對於char來說是不需要的。