Mysql中varchar與char的區別以及varchar(30)中的30代表的涵義
mysql中varchar與char的區別以及varchar(30)中的30代表的涵義
(1)varchar與char的區別
varchar儲存可變長字串,小於255位元組時需要1個額外位元組(大於255需要2個額外位元組)儲存長度,最大長度為65532位元組(所有列總和);
char儲存定長(right padding),讀取時會截斷末尾空格,長度最大為255字元;
char 與varchar都是用來儲存字串的,只是他們的儲存方式不一樣,char有固定的長度,而varchar屬於可變長的字元型別。
char是一種固定長度的型別,varchar則是一種可變長度的型別。
char(M)型別的資料列裡,每個值都佔用M個位元組,如果某個長度小於M,MySQL就會在它的右邊用空格字元補足。(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(M)型別的資料列裡,每個值只佔用剛好夠用的位元組再加上一個用來記錄其長度的位元組(即總長度為L+1位元組)。
建議:
myisam儲存引擎建議使用固定長度,資料列代替可變長度的資料列。
memory儲存引擎目前都使用固定資料行儲存,因此無論使用char,varchar列都沒有關係。
Innodb儲存引擎建議使用varchar型別。
在MySQL中用來判斷是否需要進行對資料列型別轉換的規則:
1. 在一個資料表裡,如果每一個資料列的長度都是固定的,那麼每一個資料行的長度也將是固定的。
2. 只要資料表裡有一個資料列的長度是可變的,那麼各資料行的長度都是可變的。
3. 如果某個資料表裡的資料行的長度是可變的,那麼為了節約儲存空間,MySQL會把這個資料表裡的固定長度型別的資料列轉換為相應的可變長度型別。
對於MyISAM表,儘量使用char,對於那些經常需要修改而容易形成碎片的myisam和isam資料表就更是如此,它的缺點就是佔用磁碟空間;
對於InnoDB表,因為它的資料行內部儲存格式對固定長度的資料行和可變長度的資料行不加區分(所有資料行共用一個表頭部分,這個表頭部分存放著指向各個有關資料列的指標),所以使用char型別不見得會比使用varchar型別好。事實上,因為char型別通常要比varchar型別佔用更多的空間,所以從減少空間佔用量和減少磁碟i/o的角度,使用varchar型別反而更有利。
(2)varchar(30)中30的涵義
最大儲存30個字元;varchar(5)和(200)儲存hello所佔空間一樣,但後者在排序時會消耗更多記憶體,因為order by col 採用fixed_length計算col長度(memory)引擎一樣。
For example, a varchar(255) column can hold a string with a maximum length of 255 characters(字元而非位元組),對於latin1, ‘abcd’的L為4,儲存需要5個位元組;對於ucs2(雙位元組字元),則需要10個位元組儲存(最大長度為510>255,故需要額外2個位元組)
(3)int(20)中20的涵義
20表示最大顯示寬度為20,但仍佔4個位元組儲存,儲存範圍不變;
create table int_test(a int zerofill NOT NULL auto_increment, PRIMARY KEY (a));
create table int_test_4(a int(4) zerofill NOT NULL auto_increment, PRIMARY KEY (a));
select * from int_test;
+------------+
| a |
+------------+
| 0000000001 |
| 0000000002 |
| 0000000003 |
| 2147483648 |
+------------+
select * from int_test_4;
+------------+
| a |
+------------+
| 0001 |
| 0002 |
| 0003 |
| 2147483648 |
+------------+
(4)為什麼MySQL這樣設計?
對大多數應用沒有意義,只是規定一些工具用來顯示字元的個數;int(1)和int(20)儲存和結算均一樣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21374452/viewspace-2136268/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 中 VARCHAR 最大長度及 CHAR 和 VARCHAR 的區別MySql
- MySQL中CHAR和VARCHAR區別MySql
- varchar和char的區別
- NTMySQL中varchar和char型別的區別heeMySql型別
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- MySQL中int、char、varchar的效能淺談MySql
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- 深入char、varchar、text
- mysql中varchar型別最大長度測試MySql型別
- 30. JavaScript中的“=、 =、===”區別?JavaScript
- Oracle 中varchar2 和nvarchar2區別Oracle
- 自導自演的面試現場:說說char 和 varchar的區別你瞭解多少?面試
- MySQL VARCHAR型別欄位到底可以定義多長MySql型別
- 高效能MySQL第四章 Schema與資料型別優化 VARCHAR和CHARMySql資料型別優化
- MySQL varchar詳解MySql
- 例項操作mysql varchar型別求和MySql型別
- MySQL動態修改varchar長度的方法MySql
- mysql儲存資料,varchar型別中的資料變成了科學計數法?MySql型別
- 面試官:MySQL 中 varchar(n) 中 n 最大取值為多少?面試MySql
- Mysql varchar型別欄位為什麼經常定義為255MySql型別
- Rust中 String、str、&str、char 的區別Rust
- Mysql BLOB、BLOB與TEXT區別及效能影響、將BLOB型別轉換成VARCHAR型別MySql型別
- 面試官瘋狂問我:char和varchar的區別 怎麼辦?愣著幹嘛?進來白嫖啊!面試
- mysql的varchar欄位最大長度真的是65535嗎?MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- mysql中!=和is not的區別MySql
- MySQL的varchar儲存原理:InnoDB記錄儲存結構MySql
- cookie與session的區別以及在Django中的實現CookieSessionDjango
- 說說 VARCHAR 背後的那些事
- DM8 varchar型別長度型別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- long2varchar 把long轉換為varchar2
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- Python中 ‘==‘ 與‘is‘的區別Python
- Javascript中“==”與“===”的區別JavaScript
- printf 中 % 別代表的輸出型別型別
- js中==和===的區別以及總結JS
- MySQL中datetime和timestamp的區別MySql