mysql 數據類型
一、char的長度是固定的,不管存儲的數據是多少都會是固定的長度,上限為255個字節,varchar的上限為65535字節,
char(4); //這個4表示最多存儲4個【字符】,
長度可以為從0到255的任何值,當存儲的字符串長度小于指定的長度,
會在字符串的右邊填充空格達到指定的長度,當查詢字符串的時候會刪除右邊空格
二、varchar 是變長的,
varchar(4)//這個4表示最多存儲4個【字符】,
長度可以指定為0到65535之間的值(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節),
VARCHAR值保存時只保存需要的字符數,另加一個字節來記錄長度(如果列聲明的長度超過255,則使用兩個字節)
varchar(30)最大存儲30個字符;varchar(5)和(200)存儲hello所占空間一樣,但后者在排序時會消耗更多內存,因為order by col采用fixed_length計算col長度(memory引擎也一樣)
三、int(20)中20的涵義是指顯示字符的長度
但要加參數的,最大為255,比如它是記錄行數的id,插入10筆資料,它就顯示00000000001 ~~~00000000010,當字符的位數超過11,它也只顯示11位,如果你沒有加那個讓它未滿11位就前面加0的參數,它不會在前面加0
20表示最大顯示寬度為20,但仍占4字節存儲,存儲范圍不變;
四、text
text的上限位65535,不能設定默認值
五、總結char,varchar,text區別
char,存定長,速度快,存在空間浪費的可能,會處理尾部空格
varchar,存變長,速度慢,不存在空間浪費,不處理尾部空格,上限65535,但是有存儲長度實際65532最大可用
text,存變長大數據,速度慢,不存在空間浪費,不處理尾部空格,上限65535,會用額外空間存放數據長度,顧可以全部使用65535。
長度的區別,char范圍是0~255,varchar最長是64k,但是注意這里的64k是整個row的長度,要考慮到其它的column,還有如果存在not null的時候也會占用一位,對不同的字符集,有效長度還不一樣,比如utf8的,最多21845,還要除去別的column,但是varchar在一般情況下存儲都夠用了。如果遇到了大文本,考慮使用text,最大能到4G。
效率來說基本是char>varchar>text,但是如果使用的是Innodb引擎的話,推薦使用varchar代替char
char和varchar可以有默認值,text不能指定默認值
取數據的時候,char類型的要用trim()去掉多余的空格,而varchar是不需要的,盡管如此,char的存取數度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找;但是char也為此付出的是空間的代價,因為其長度固定,所以難免會有多余的空格占位符占據空間,可謂是以空間換取時間效率,而varchar是以空間效率為首位的。再者,char的存儲方式是,對英文字符(ASCII)占用1個字節,對一個漢字占用兩個字節;
而varchar的存儲方式是,對每個英文字符占用2個字節,漢字也占用2個字節,兩者的存儲數據都非unicode的字符數據。
空間方面:
從官方文檔中我們可以得知當varchar大于某些數值的時候,其會自動轉換為text,大概規則如下:
大于varchar(255)變為 tinytext
大于varchar(500)變為 text
大于varchar(20000)變為 mediumtext
所以對于過大的內容使用varchar和text沒有太多區別。
性能方面:
索引會是影響性能的最關鍵因素,而對于text來說,只能添加前綴索引,并且前綴索引最大只能達到1000字節。
而貌似varhcar可以添加全部索引,但是經過測試,其實也不是。由于會進行內部的轉換,所以long varchar其實也只能添加1000字節的索引,如果超長了會自動截斷。
當超過255的長度之后,使用varchar和text沒有本質區別,只需要考慮一下兩個類型的特性即可。
(4)、
mysql為什么這么設計
對大多數應用沒有意義,只是規定一些工具用來顯示字符的個數;int(1)和int(20)存儲和計算均一樣;
參考:http://www.cnblogs.com/billyxp/p/3548540.html