MySQL 5.1 リファレンスマニュアル :: 10 データタイプ :: 10.4 文字列タイプ :: 10.4.3 BLOBとTEXT タイプ
« 10.4.2 BINARY と VARBINARY タイプ

10.4.4 ENUM タイプ »
Section Navigation      [Toggle]
  • 10.4 文字列タイプ
  • 10.4.1 CHAR と VARCHAR タイプ
  • 10.4.2 BINARY と VARBINARY タイプ
  • 10.4.3 BLOBとTEXT タイプ
  • 10.4.4 ENUM タイプ
  • 10.4.5 SET タイプ

10.4.3. BLOBとTEXT タイプ

BLOB は様々な大きさのデータを保持する事ができる大きいバイナリオブジェクトです。4つの BLOB タイプは、TINYBLOB、 BLOB、MEDIUMBLOB、そしてLONGBLOB です。これらは、保持する事ができる最大長さだけが異なっています。4つの TEXT タイプは、TINYTEXT、TEXT、MEDIUMTEXT、そして LONGTEXT です。これらは4つの BLOB タイプに対応し、最大長さと必要とする記憶容量は同じです。項10.5. 「データタイプが必要とする記憶容量」を参照してください。TEXT や BLOB カラムのレターケースの変換は格納や検索時には行われません。

BLOB カラムはバイナリ文字列(バイト文字列)として扱われます。TEXT カラムは非バイナリ文字列(文字の文字列)として扱われます。BLOB カラムは文字セットを持たないので、ソートと比較は値の中の数値バイトに基づいています。TEXT カラムは文字セットを持つので、値は文字セットの照合に基づいてソート、比較されます。

もし TEXT カラムがインデックスされていたら、インデックス入力比較は最後にスペースが詰められます。これは、もしそのインデックスが固有の値を要求するなら、後続スペースだけが異なる値に対して重複キーエラーが発生するという事を意味します。例えば、もしテーブルが 'a' を含んでいると、'a ' を格納しようとした時重複キーエラーになります。これは BLOB カラムには当てはまりません。

ストリクトモードで実行していない時に、BLOB や TEXT カラムに、そのデータタイプの最大長を超える値を指定すると、その値は切り捨てられます。切り捨てられた文字がスペースで無い場合には警告メッセージが表示されます。ストリクトモードを利用すると、警告と共に値が切り捨てられるのではなく、エラーを発生させて、その値を拒否させる事ができます。項4.2.6. 「SQL モード」を参照してください。

あらゆる点で、BLOB カラムを、好きな長さに設定できる VARBINARY カラムだと考える事ができます。同じように、TEXT カラムを VARCHAR カラムと考える事ができます。BLOB と TEXT は、次の点で VARBINARY と VARCHAR とは異なっています。

  • BLOB と TEXT カラムのインデックスには、インデックスプリフィックス長を指定しなければいけません。CHAR と VARCHAR では、プリフィックス長は任意です。項6.4.3. 「カラムインデックス」を参照してください。

  • BLOB と TEXT カラムは DEFAULT を持つ事ができません。

LONG と LONG VARCHAR は MEDIUMTEXT データタイプにマップします。これは互換性の特徴です。もし BINARY 属性を TEXT データタイプと一緒に利用するなら、そのカラムはカラム文字セットのバイナリ照合に指定されます。

MySQLコネクタ/ODBCは BLOB 値を LONGVARBINARY として、TEXT 値をLONGVARCHAR として定義します。

BLOB と TEXT 値は大変長くなり得るので、それらを利用する時にいくつかの制約が発生します。

  • カラムの max_sort_length バイトだけがソートに利用されます。max_sort_length のデフォルト値は1024です。この値は、mysqldサーバーを開始する時に --max_sort_length=N オプションを利用して変更する事ができます。項4.2.3. 「システム変数」を参照してください。

    max_sort_length の値をランタイムに増やす事で、ソートとグループの際により多くのバイトを有効にする事ができます。全てのクライアントがそのセッション max_sort_length 変数の値を変更する事ができます。

    mysql> SET max_sort_length = 2000;
    mysql> SELECT id, comment FROM t
        -> ORDER BY comment;
    

    GROUP BY や ORDER BY を、max_sort_length バイトよりも多くのバイトを有効にしたい時の長い値を含む BLOB や TEXT カラム上で利用する別の方法は、カラム値を固定長オブジェクト変換するという方法です。これを行う標準的な方法は SUBSTRING() 関数を利用する方法です。例えば、次のステートメントによって comment カラムの2000バイトがソートの際に考慮されるようになります。

    mysql> SELECT id, SUBSTRING(comment,1,2000) FROM t
        -> ORDER BY SUBSTRING(comment,1,2000);
    
  • BLOB や TEXT オブジェクトの最大サイズはそのタイプによって判断されますが、クライアントとサーバーの間で実際に送信できる最大値は、有効メモリの量とコミュニケーションバッファのサイズによって判断されます。max_allowed_packet 変数の値を変更する事でメッセージバッファサイズを変更する事ができますが、サーバとクライアントプログラムの両方に対してその作業を行う必要があります。例えば、mysql と mysqldump の両方がクライアント側の max_allowed_packet 値を変更する事を許可します。項6.5.2. 「サーバパラメータのチューニング」、項7.7. 「mysql — MySQL コマンド ライン ツール」、項7.12. 「mysqldump — データベースバックアッププログラム」を参照して下さい。ソート中のパケットサイズとデータオブジェクトのサイズを必要とする記憶容量に基づいて比較したい場合には、 項10.5. 「データタイプが必要とする記憶容量」 を参照してください。

BLOB や TEXT 値はそれぞれ内部的に別々に割り当てられたオブジェクトによって表現されます。これは、テーブルが開かれた時にそれぞれのカラムに容量が一度割り当てられるという形の、その他全てのデータタイプとは異なります。

時には、メディアファイルのようなバイナリデータを BLOB や TEXT カラムに格納する事が望ましい場合もあるでしょう。MySQLの文字列操作関数がこのようなデータを利用するのに役に立つでしょう。項11.3. 「文字列関数」を参照してください。安全とその他の理由の為、これを行うには、アプリケーションユーザに FILE 特権の利用を許可するのではなく、アプリケーションコードを利用して行う方が望ましいです。詳細については、MySQLフォーラムで、様々な言語やプラットフォームで議論する事ができます。(http://forums.mysql.com/)

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates