MySQLの微妙に痛い制限

| コメント(0) | トラックバック(0)

虚に入りがちで忘れやすいInnoDBに対する制限。

The maximum row length, except for VARCHAR, BLOB and TEXT columns, is slightly less than half of a database page. That is, the maximum row length is about 8000 bytes. LONGBLOB and LONGTEXT columns must be less than 4GB, and the total row length, including also BLOB and TEXT columns, must be less than 4GB. InnoDB stores the first 768 bytes of a VARCHAR, BLOB, or TEXT column in the row, and the rest into separate pages.

テキスト型及びBLOB型及びVARCHAR型を除く一行の総バイト数は
8000バイトまで。テキスト型及びBLOB型及びVARCHAR型は
それ以上格納できるが行最初の768バイト迄は他の型と
同じところに格納する為、合計値8000バイトを超えられない。
つまりVARCHAR型だけで長さ100のカラムを作ると80個迄しか
作成できない。

ポイントは文字コードをマルチバイトにしているとテーブルは
作成できてもデータは格納できない条件が在り得る事。

CREATE TABLE t1 (
c1 VARCHAR(100),
c2 VARCHAR(100),
...
c39 VARCHAR(100),
c40 VARCHAR(100)
) ENGINE = InnoDB DEFAULT CHARSET latin1;

この場合総文字列長しては4000バイトの為作成可能。

CREATE TABLE t1 (
c1 VARCHAR(100),
c2 VARCHAR(100),
...
c39 VARCHAR(100),
c40 VARCHAR(100)
) ENGINE = InnoDB DEFAULT CHARSET utf8;

この場合総文字列長は理論上(UCS-4の場合) 4×100x40 = 16000バイト
(厳密に言うと理論値では6×100x40 = 24000バイト)
格納できる事となり8000バイトを超えてしまう。
間違っていたので訂正。
この場合総文字列長は理論上3×100x40=12000バイト格納できることとなり 8000バイトを超えてしまう。
(※MySQLのUTF8は3バイト文字までしか対応していない。)

この為、テーブルの作成は出来てもインサートエラーとなってしまうので
気をつける必要がある。

もっとも、このようなテーブルの場合テーブル定義を見直すのが
第一だと思うけれども。

トラックバック(0)

トラックバックURL: http://www.intheforest.jp/mtadmin/mt-tb.cgi/4

コメントする

ウェブページ