mysqlのvarcharとtextの比較


varcharとtextはmysql文字記憶の議論が多い分野で、いったい大きなフィールドがそれを使ったほうがいいのか、比較してから自分で選択します.
サイズ比較VARCHAR:varcharはmysqlで最大行幅制限、すなわち65535(64 k)バイトを満たす必要があるが、varchar自体は文字列個数で定義されており、mysqlではuft-8文字セットを用いる1文字が3バイトを占有するため、単表varcharの実際の占有最大長は以下の通りである.    1.utf-8文字符号化セットvarcharを使用する最大長は(65535-2)/3=2184文字(255バイトを超えると2バイトの余分な占有スペースオーバーヘッドが発生するため、2を減らし、255以下であれば1を減らす).    2.utf-8 mb 4文字セットを使用してmysqlでutf-8 mb 4文字セットを使用すると、1文字あたり4バイトを占有するため、varcharの最大長は(65535-2)/4=16383文字(255バイトを超えると2バイトの余分な占有スペースオーバーヘッドが発生するため、2を減らし、255以下であれば1を減らす).
注意:utf-8 mb 4文字セットを使用する場合、utf-8文字を記憶する必要がある場合、3バイトしか占めない場合があるため、utf-8 mb 4はutf-8のスーパーセットであるため、この計算値よりも多くの文字を記憶できる場合がある.
TEXT:最大制限も64 kバイトであるが、本質はオーバーフローメモリであり、innodbはデフォルトでは上位768バイトのみがデータページに格納、残りのデータはオーバーフローセグメントに格納され、単一テーブル65535の最大行幅にも制限されるがmysqlテーブルの各BLOBとTEXT列は実際にはその中の5~9バイトしか占めず、その他の部分はオーバーフローメモリになる.したがって、実際の占有テーブルの最大行幅は9+2バイトであり、追加のオーバーヘッドが加算され、テーブルの実際の幅とは関係ない.    1.utf-8文字セットを使用する場合、単一フィールドの最大長は21844文字である.    2.ただし、単一テーブルには複数のtextフィールドを設定できます.これにより、単一テーブルの最大行幅65535の制限を突破します.
注意:新しい行フォーマットタイプBarracuda(梭子魚)を採用する場合、このファイルフォーマットは新しい2つの行フォーマット:compressedとdynamicを有し、2つのフォーマットはblob/textフィールドに対して完全にオーバーフローする方式を採用し、データページには20バイトしか保存されず、残りはオーバーフローセグメントに保存される.
その他text:
textフィールドは、varcharのように1つではなく、上のtextのほかに、次の3つがあります.
TinyText:最大255バイト、実は意味のないタイプです.
MEDIUMTEXT:最大長16 Mバイト制限.通常のtextと同様にオーバーフローストレージもサポートされているため、実際の占有テーブルの最大行幅は9+3バイトであり、追加オーバーヘッドLONGTEXT:最大長制限4 Gバイトを加えている.通常のtextと同様にオーバーフローストレージもサポートされているため、実際の占有テーブルの最大行幅は9+4バイトで、追加のオーバーヘッドが加算されます.
----------------------------------------
例:
#VARCHAR           21844
CREATE TABLE test(
    va VARCHAR(21845)
)DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
#      
CREATE TABLE test(
    va VARCHAR(21844)
)DEFAULT CHARSET=utf8;
     : 0
  : 0.155s
#    BLOB TEXT         5 9   。     
CREATE TABLE test(
    va VARCHAR(21841),
    tx text
)DEFAULT CHARSET=utf8;
[Err] 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
#  9+2    
CREATE TABLE test(
    va VARCHAR(21840),
    tx text
)DEFAULT CHARSET=utf8;
     : 0
  : 0.170s

--------------------------------------------------------
余分なスペースオーバーヘッドの説明:varcharが255 byte未満1 byte overheadvarcharが255 byteより大きい2 byte overheadtinytext 0-255 1 byte overheadtext 0-65535 byte 2 byte overheadmediumtext 0-16 M 3 byte overheadlongtext 0-4 Gb 4 byte overhead
注意:
textフィールドは768バイトを超える大部分のデータオーバーフローをハードディスクの他の空間に格納し、ディスク圧力をさらに増加させるように見える.しかし、処理形態から言えばvarcharが768バイトを超えると、実質的な記憶とtextの差はあまり大きくない.超長いvarcharもオーバーフローストレージを使うので、その行を読み取るのもハードディスクを読んでメモリにロードするので、基本的には同じだと思います.
また8000 byteという点から説明するとmysqlのinnodb data pageのデフォルトの1つのデータページは16 Kで、2行のデータを格納するのでvarcahrの場合、textは1行のデータが8000 byteを超えなければoverflowは別のpageに格納されません.
相違点:textフィールド、MySQLではデフォルト値は許可されていません.インデックスを作成するには、接頭辞インデックスの長さを指定する必要があります.varcharはデフォルト値を許可し、インデックスの長さに制限はありません.
注意:
InnoDBエンジンの単一フィールドインデックスのデフォルト長は最大767バイト、myisamは1000バイトである.例えば、文字符号化がutf 8である、varcharのインデックスの最大長は256文字である.制限を超えると、インデックスの作成に失敗し、接頭辞インデックスを作成する必要があります.innodb_の設定large_prefix=1は、インデックスが動的圧縮を使用できるように制限を大きくすることができますが、テーブルのrow_formatはcompressedかdynamicでなければなりません.インデックス列の長さは767 bytesより大きくすることができますが、総長さは3072 bytesより大きくすることはできません.
まとめ:ストレージの実装によると、textの代わりにvarcharを使用することが考えられる.varcharはストレージがより弾力性があり、ストレージデータが少ないと性能がより高く、空でないデフォルト値が必要な場合はvarcharを使用しなければならない.64 Kより大きい場合はmediumtext、longtextを使用しなければならない.varcharはすでに保存できないため、varchar(255+)の後、textのストレージメカニズムと同様に、パフォーマンスもほぼ同じです.varchar(255)は255 byteだけでなく、実質的により多くの消費が可能であることに特に注意する必要があります.
呉炳錫先生の指導に感謝します.
参考記事アドレス:http://wubx.net/varchar-vs-text/
https://blog.csdn.net/free_ant/article/details/52936756
https://blog.csdn.net/q3dxdx/article/details/51014357