MySQL中CHAR和VARCHAR
MySQL數據庫的字符(串)類不要以為字符類型就是CHAR,CHAR和VARCHAR的區別在于CHAR是固定長度,只要你定義一個字段是CHAR(10),那么不論你存儲的數據是否達到了10個字節,它都要占去10個字節的空間;而VARCHAR則是可變長度的,如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為VARCHAR(10)是最合算的,VARCHAR類型的占用空間是它的值的實際長度+1。
為什么要+1呢?這一個字節用于保存實際使用了多大的長度。從這個+1中也應該看到,如果一個字段,它的可能值最長是10個字符,而多數情況下也就是用到了10個字符時,用VARCHAR就不合算了:因為在多數情況下,實際占用空間是11個字節,比用CHAR(10)還多占用一個字節。
舉個例子,就是一個存儲股票名稱和代碼的表,股票名稱絕大部分是四個字的,即8個字節;股票代碼,上海的是六位數字,深圳的是四位數字。這些都是固定長度的,股票名稱當然要用CHAR(8);股票代碼雖然是不固定長度,但如果使用VARCHAR(6),一個深圳的股票代碼實際占用空間是5個字節,而一個上海的股票代碼要占用7個字節!考慮到上海的股票數目比深圳的多,那么用VARCHAR(6)就不如CHAR(6)合算了。
雖然一個CHAR或VARCHAR的最大長度可以到255,我認為大于20的CHAR是幾乎用不到的――很少有大于20個字節長度的固定長度的東東吧?不是固定長度的就用VARCHAR。大于100的VARCHAR也是幾乎用不到的――比這更大的用TEXT就好了。
TINYTEXT,最大長度為255,占用空間也是實際長度+1;TEXT,最大長度65535,占用空間是實際長度+2;MEDIUMTEXT,最大長度16777215,占用空間是實際長度+3;LONGTEXT,最大長度4294967295,占用空間是實際長度+4。為什么+1、+2、+3、+4?你要是還不知道就該打PP了。這些可以用在論壇啊、新聞啊,什么的,用來保存文章的正文。根據實際情況的不同,選擇從小到大的不同類型。
例子:
創建表:
mysql> createtabletab1(colchar(10));
QueryOK, 0 rowsaffected (0.21 sec)
mysql> insertintotab1values('string1'),(' string2'),('string3 ');
QueryOK, 3 rowsaffected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
char末尾空格已經被刪除
mysql> selectconcat("'",col,"'") fromtab1;
+---------------------+
| concat("'",col,"'") |
+---------------------+
| 'string1' |
| ' string2' |
| 'string3' |
+---------------------+
3 rowsin set (0.84 sec)
varchar就不會刪除空格:
mysql> createtabletab2(colvarchar(10));
QueryOK, 0 rowsaffected (0.38 sec)
mysql> insertintotab2values('string1'),(' string2'),('string3 ');
QueryOK, 3 rowsaffected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> selectconcat("'",col,"'") fromtab2;
+---------------------+
| concat("'",col,"'") |
+---------------------+
| 'string1' |
| ' string2' |
| 'string3 ' |
+---------------------+
3 rowsin set (0.09 sec)
MySQL中CHAR和VARCHAR
來自:https://xiequan.info/mysql中char和varchar/