之前有一個需求,要求輸入描述限制上限爲5000字符。由於需要新設計表結構,所以我有了一個疑問,到底設計表的時候,字段類型如何才能更合理,不浪費存儲空間,於是瞭解了一下比較常用的char、varchar、text的區別。
首先需要知道漢字和字節字符的關係,關係如下:
1、 1個漢字 = 1個字 = 1個字符
2、 1個字符 = 1個字節 = 8bit(ACSII碼下)
3、 1個字符 = 2個字節 = 16bit(Unicode碼下)
字符並不是計算機語言, 一般情況下,漢字一個字佔兩個字節。英文字母一個字母佔一個字節。
我試了下char(2)和varchar(2), 都能存2個英文字母或者2個漢字, varchar(10) 既10個字符可以存10個漢字,不太明白這個n是表示字節還是字符,查了下資料:
1、char(n)和varchar(n)中括號中n代表字符的個數,並不代表字節個數,所以當使用了中文的時候(UTF8)意味着可以插入m箇中文,但是實際會佔用m*3個字節。
2、同時char和varchar最大的區別就在於char不管實際value都會佔用n個字符的空間,而varchar只會佔用實際字符應該佔用的空間+1,並且實際空間+1<=n。
3、超過char和varchar的n設置後,字符串會被截斷。
4、char的上限爲255字節,varchar的上限65535字節,text的上限爲65535。
5、char在存儲的時候會截斷尾部的空格,varchar和text不會。
6、varchar會使用1-3個字節來存儲長度,text不會。
我使用的mysql版本是14.14,括號中的數字指的是長度,char範圍是0~255,varchar最長是64k。
char>varchar>text,但是如果使用的是Innodb引擎的話,推薦使用varchar代替char。
所以綜上這個字段設計時候我寫成了varchar(5000),雖然看起來比較奇怪,但是比text更合適一點。