Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  .frm ファイル構造により課せられる制限

D.10.5 .frm ファイル構造により課せられる制限

それぞれのテーブルにはテーブル定義を含む .frm ファイルがあります。サーバーは次の式を使用して、64K バイトの上限に対して、ファイルに格納されたいくつかのテーブル情報をチェックします。

if (info_length+(ulong) create_fields.elements*FCOMP+288+
    n_length+int_length+com_length > 65535L || int_count > 255)

.frm ファイルに格納された情報のうち式に対してチェックされる部分は 64K バイトの制限を超えることはできません。したがって、テーブル定義がこのサイズに達した場合、これ以上カラムを追加できません。

式の関連因子は次のとおりです。

  • info_length は、画面に必要な領域です。これは MySQL の Unireg から継承したものです。

  • create_fields.elements はカラム数です。

  • FCOMP は 17 です。

  • n_length は、名前あたり 1 バイトの区切り文字を含む、すべてのカラム名の合計長です。

  • int_length は、ENUM および SET カラムの値のリストに関連します。このコンテキストでは、int整数の意味ではありません。これは間隔を意味し、ENUM および SET カラムの総称です。

  • int_count は、一意の ENUM および SET 定義の数です。

  • com_length はカラムコメントの合計長です。

前述の式には、許可されるテーブル定義に対し複数の意味があります。

  • 長いカラム名を使用すると、ENUM または SET カラムを含めたり、カラムコメントを使用したりした場合と同様に、カラムの最大数が減ることがあります。

  • テーブルに保持できる一意の ENUM および SET 定義は 255 以下です。同一要素リストを持つカラムは、この制限に対して同じと見なされます。たとえば、次の 2 つのカラムがテーブルに含まれる場合、これらは定義が同一なので、この制限に対して (2 つではなく) 1 つと見なされます。

    e1 ENUM('a','b','c')
    e2 ENUM('a','b','c')
  • 一意の ENUM および SET 定義内の要素名の合計長は、64K バイトの制限に対して加えられるので、特定の ENUM カラムの要素の数に対する理論的な制限は 65,535 ですが、実際の限度は 3000 未満です。


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  Posted by Michael Clark on April 9, 2013
Documentation is at this time currently correct about com_length not including the table comment - see com_length in pack_header in sql/unireg.cc. In mysql-5.1.68 the relevant lines are 607 (set to 0), 638 (field->comment.length), 722 (the formula cited).

Also, while int_length is "related" to the list of values for ENUM and SET columns, the relationship is:
length of each string in each interval + 1 (for padding) + 2 * number of intervals (for terminal markers)
See lines 606 (set to 0), 704 (strlen+1), 711 (+= int_count*2), 723 (the formula cited).
  Posted by Michael Clark on April 8, 2013
info_length is (using integer or truncating division): (((create_fields.elements - 1)/19)+1)*48 as best I can tell - see pack_screens in sql/unireg.cc - note that pos is incremented by 4+(cols>>1)+4 each time row == end_row, which loops from [4,22], for a loop size of 19 (4..22 inclusive, due to the post increment). Since cols is fixed at 80, cols>>1 is 40, and the total increment is 48. Because we can, we assume small_file is true. Since row starts at end_row, we subtract one before the divisor and add it back afterwards - we might also simply add 18 to create_fields.elements similar to elsewhere in the documentation (adding 7 before dividing by 8).
Sign Up Login You must be logged in to post a comment.