1

私のmysqlデータベースの列を次のように定義しました:

ALTER TABLE `my_table` CHANGE `desc` `desc` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

しかし、フロントエンドからテキストを入力してテーブルに挿入すると、列データのサイズが 233 に達した後、追加されたテキストが切り捨てられます。つまり、233 文字を超えるテキストは保存されません!!

列のサイズを VARCHAR(511) に変更しようとしましたが、成功しませんでした。

PHPで文字数を数えstrlen()たら233文字だった

MySQL がこれを行っている理由と、テキストを保存するにはどうすればよいですか?

4

2 に答える 2

2

VARCHAR(250) NOT NULLは、長さ n を格納するために 1 バイト、実際の文字列を格納するために n バイトを必要とします。したがって、値「abc」を保持する列は 4 バイトになります。NULL では、nullity は 1 ビットを取り、VARCHAR(250)NULL 値は他には何も取りません。null 以外の値はそのビットを取り、長さは 1 バイト、データは n バイトです。ここでビットが必要になるということは、複数の null 許容列が 1 つ以上のバイトを共有して null を記録することを意味します。

他の可変長データ型も同様です。さまざまなサイズの BLOB 型と TEXT 型では、長さが 1 バイトを超える場合がありますが、それ以外はほとんど同じように機能します。固定長の CHAR 型と同様に、数値型にも一定のメモリ要件があります。その内容はその固定長にスペースで埋め込まれているため、CHARは長さバイトを省略すると思います。

インデックスにより、メモリ要件が増加する場合があります。マルチバイト文字セット (を含むUTF-8) はメモリ要件を増加させる可能性があるため、上記のステートメントは、テーブルが latin1 または同様のもの用に作成された場合にのみ保持されます。したがって、255文字を意味するものではないと推測できVARCHAR(250)ます。文字列をどのようにエンコードするかによって異なります

于 2012-10-01T12:02:38.467 に答える
1

関数を使用mb_strlen()して文字数をカウントします。これはマルチバイトセーフです。文字列にいくつかの特殊文字が含まれているようです。 hereを参照してください。

MySQL サーバーのバージョンと設定によって異なりますが、挿入または更新中に一部の文字列が事前定義された長さを超えると、MySQL はその超過部分を自動的に切り捨てます。

于 2012-10-01T11:58:37.367 に答える