TEXT類型一般分為 TINYTEXT(255長度)、TEXT(65535)、 MEDIUMTEXT(int最大值16M),和LONGTEXT(long最大值4G)這四種,它被用來存儲非二進制字符集,二進制字符集使用blob類型的字段來存儲。
對於text列,插入時MySQL不會對它進行填充,並且select時不會刪除任何末尾的字節。
如果text列被作為索引,則在它的內容后面添加空格時,會出現duplicate key錯誤,也就是說,如果我們定義了一個作為索引的text字段,它的值是'a',則不能定義一個值為'a '的記錄,因為這樣會產生沖突。
對text列進行排序的時候,決定順序的字符個數是由參數max_sort_length來決定的
text和varchar的區別
SET max_sort_length=1000; SELECT id,comment FROM table ORDER BY comment;
在大多數情況下,我們可以把text視為varchar字段,但是這兩個字段類型在存儲字符大小上有一些區別:
varchar在mysql中必須滿足最大行寬度限制,也就是 65535(64k)字節,而varchar本身是按字符串個數來定義的,在mysql中使用uft-8字符集一個字符占用三個字節,所以單表varchar實際占用最大長度如下:
1.使用utf-8字符編碼集varchar最大長度是(65535-2)/3=21844個字符(超過255個字節會有2字節的額外占用空間開銷,所以減2,如果是255以下,則減1)。
2.使用 utf-8mb4字符集,mysql中使用 utf-8mb4 字符集一個字符占用4個字節,所以 varchar 最大長度是(65535-2)/4=16383 個字符(超過255個字節會有2字節的額外占用空間開銷,所以減2,如果是255以下,則減1)。
text的最大限制也是64k個字節,但是本質是溢出存儲,innodb默認只會存放前768字節在數據頁中,而剩余的數據則會存儲在溢出段中。text類型的數據,將被存儲在元數據表之外地方,但是varchar/char將和其他列一起存儲在表數據文件中,值得注意的是,varchar列在溢出的時候會自動轉換為text類型。text數據類型實際上將會大幅度增加數據庫表文件尺寸。
除此之外,二者還有以下的區別
1、當text作為索引的時候,必須 制定索引的長度,而當varchar充當索引的時候,可以不用指明。
2、text列不允許擁有默認值
3、當text列的內容很多的時候,text列的內容會保留一個指針在記錄中,這個指針指向了磁盤中的一塊區域,當對這個表進行select *的時候,會從磁盤中讀取text的值,影響查詢的性能,而varchar不會存在這個問題。