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. 「カラムインデックス」を参照してください。
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=
オプションを利用して変更する事ができます。項4.2.3. 「システム変数」を参照してください。
N
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/)