1. 程式人生 > >mysql的varchar與text對比

mysql的varchar與text對比

mysql varchar text

varchar和text是mysql字符存儲爭議比較多的領域,究竟大字段用那個比較好,我們來對比一下,然後自行選擇.

大小對比
VARCHAR :varchar在mysql中滿足最大行限制,也就是 65535(16k)字節,在mysql中使用 uft-8(mysql中的 utf-8 和我們正常的編碼utf-8不同)字符集一個字符占用三個字節,
①使用utf-8字符編碼集varchar最大長度是(65535-2)/3=21844個字符(超過255個字符會有2字節的額外占用空間開銷,所以減2,如果是255以下,則減1)。
②使用 utf-8mb4 字符集(mysql中 utf-8mb4 字符集也就是我們通常使用的 utf-8 字符集),mysql中使用 utf-8mb4 字符集一個字符占用4個字節,所以 varchar 最大長度是(65535-2)/4=16383 個字符(超過255個字符會有2字節的額外占用空間開銷,所以減2,如果是255以下,則減1)。

TEXT :最大限制是64k,
采用 utf-8 字符集,(262144-2)/3=87381 個字符。
采用 utf-8mb4字符集,(262144-2)/4=65535 個字符。
MEDIUMTEXT :最大長度限制16M (16M-3)/3 = 5,592,405 個字符
LONGTEXT :最大長度限制4G
----------------------------------------
額外占用空間開銷說明:
varchar 小於255byte 1byte overhead
varchar 大於255byte 2byte overhead
tinytext 0-255 1 byte overhead
text 0-65535 byte 2 byte overhead
mediumtext 0-16M 3 byte overhead
longtext 0-4Gb 4byte overhead
從處理形態上來講varchar 大於768字節後,實質上存儲和text差別不是太大了.基本認為是一樣的。另外從8000byte這個點說明一下:對於varcahr, text如果行不超過8000byte(大約的數,innodb data page的一半) ,overflow不會存到別的page中。
----------------------------------------
差異點:
text字段,MySQL不允許有默認值。建立索引必須給出前綴索引長度.
varchar允許有默認值,對索引長度沒限制,
但InnoDB引擎單一字段索引的默認長度最大為767字節,myisam為1000字節.例如字符編碼是utf8,那麽varchar的索引最大長度是256個字符.超出限制會導致索引創建不成功,轉而需要創建前綴索引.設置innodb_large_prefix=1可以增大限制,允許索引使用動態壓縮,但是表的row_format必須是compressed或者dynamic.可以使索引列長度大於767bytes,但是總長度不能大於3072 bytes.
----------------------------------------
總結:
  根據存儲的實現: 可以考慮用varchar替代tinytext
  如果需要非空的默認值,就必須使用varchar
  如果存儲的數據大於64K,就必須使用到mediumtext , longtext
  varchar(255+)和text在存儲機制是一樣的
  需要特別註意varchar(255)不只是255byte ,實質上有可能占用的更多。


感謝吳炳錫老師指導

參考文章地址:http://wubx.net/varchar-vs-text/


mysql的varchar與text對比