mysql VRCHARRの最大長さはいくらですか?

3083 ワード

以前は2バイトで長さを記録していると思っていましたが、この問題は退屈でしたが、後でグループの中に説明されました。これは簡単なMYSQL COMPACT形式ではないことに気づきました。1バイトごとにNULLフィールド分布を表しています。もしテーブルの中にフィールドがあれば、空いています。最大65532までしか決められません。もしフィールドが空いていないなら、そのバイトは節約できます。最大で65533まで定義できます。この原因かどうかは分かりません。インターネットで資料を見て、また現地で実験をしました。元々vacharの最大長さは本当に不定です。innodb+latinの環境
 
-- success
drop table if exists test;
create table test(name varchar(65533) not null)engine=innodb DEFAULT CHARSET=latin1
-- too large
drop table if exists test;
create table test(name varrhar(65533)engine=innodb DEFALT CHARSET=latin 1は第二の場合、空いているフィールドを許可する時は65533の長さに加えられないので、最大65532まで、さすがに引用文のような言い方です。ネットでも似たような実験をしている人がいます。参考にしてください。http://stackoverflow.com/questions/8295131/best-practise-for-sql-varchar-column-length
 
name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1)
name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1)
name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1)
name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte
まとめてみます。元々mysqlのvacharフィールドのタイプは最大長さが65535ですが、こんなに多くのデータをためることができません。最大65533までです。空でないフィールドが許可されている場合は65532までだけです。これは固定数字ではありません。この論文では、制限規則を簡単に説明します。streenは文字列の長さを計算します。中国語で2文字のmb_を計算します。strelenは、その文字符号化モードに従って、統計文字「count」を計算した配列の要素数またはオブジェクト中の属性個数
 
<?php
header('Content-Type:text/html;charset=UTF-8');
$string1=" ";//
$string2="xcy";//
//
echo strlen($string1);
echo "</br>";
echo strlen($string2);
echo "</br>";
// php mb_strlen
echo mb_strlen($string1,'utf8');
echo "</br>";
echo mb_strlen($string2,'utf8');
echo "</br>";
?>
を出力した結果、9 3 3 1、制限ルールフィールドの制限は、フィールド定義時に以下の規則があります。内容の先頭は1バイトから2バイトで実長を表しています。(長さが255を超える場合は2バイトが必要です。)ので、最大長さは65535を超えてはいけません。b)符号長制限文字の種類がgbkの場合、各文字は最大2バイトを占め、最大長さは32766を超えてはいけない。文字タイプがutf 8の場合、各文字は最大3バイトで、最大長さは21855を超えてはいけません。英語の比較的多いフォーラムでは、GBKを使うと文字ごとに2バイトを占有しますが、UTF-8英語を使うと1バイトしか占めません。定義時に上記の制限を超えると、varharフィールドは強制的にtextタイプに変更され、warningが発生します。c)行長制限により、実際のアプリケーションでは、varhar長さが1行定義の長さとなる。MySQLは行の定義長さが65535を超えてはいけないと要求しています。定義された表の長さがこの値を超えると、ERROR 1118(42000):Row size too large.The maximrow size for the used table type,not counting BLOBs,is 65535.You have to change some columns to TEXT or BLObsが提示されます。2、計算例を二つ挙げて、実際の長さの計算を説明します。a)一つの表が一つのvarharタイプだけであれば、create table t 4(c varhar(N))charset=gbkと定義される。ここでNの最大値は(65535-2)/2=32766です。マイナス1の理由は、実際の行の記憶が第二バイトから開始されるためである。マイナス2の原因は、varrharの頭の2バイトが長さを表しています。2を除いた理由は文字コードがgbkです。b)一つの表がcreate table t 4と定義されると(c int,c 2 char(30),c 3 varhar(N)charset=utf 8;ここでNの最大値は(65535-1-4-30*3)/3=21812マイナス1とマイナス2は上記と同じです。4を減らす理由は、intタイプのcが4バイトを占めるからです。30*3を減らす理由は、char(30)が90バイトを占有し、符号化はutf 8であるからです。varrharに上記のbルールを超えてtextタイプに強く変換されると、各フィールドの占有定義長は11バイトであり、もちろんこれはもう「varhar」ではない。