BLOB
は様々な大きさのデータを保持することができる大きいバイナリオブジェクトです。4
つの BLOB
型は、TINYBLOB
、BLOB
、MEDIUMBLOB
、そして
LONGBLOB
です。これらは、保持することができる最大長さだけが異なっています。4
つの TEXT
型は、TINYTEXT
、TEXT
、MEDIUMTEXT
、そして
LONGTEXT
です。これらは 4 つの
BLOB
型に対応し、最大長さと必要とする記憶容量は同じです。項6.5. 「データ型のストレージ要件」
を参照してください。
BLOB
カラムはバイナリ列(バイト列)として扱われます。TEXT
カラムは非バイナリ列 (文字列)
として扱われます。BLOB
カラムはキャラクタセットを持たないので、ソートと比較は値の中の数値バイトに基づいています。TEXT
カラムはキャラクタセットを持つので、値はキャラクタセットの照合に基づいてソート、比較されます。
厳密な SQL
モードが有効でない場合に、BLOB
または TEXT
カラムにその最大長を超える値を割り当てると、その値はカラムの最大長に合わせて切り捨てられ、警告メッセージが表示されます。スペース以外の文字の切り捨てに関しては、厳密な
SQL
モードを使用することで、警告ではなくエラーを発生させて、その値の挿入を抑制することができます。Server SQL Modes
を参照してください。
MySQL 5.1.24 以降のバージョンでは、SQL
モードに関係なく、TEXT
カラムに挿入される値から超過した末尾のスペースが切り捨てられると、必ず警告メッセージが表示されます。(Bug#30059)
もし TEXT
カラムがインデックスされていたら、インデックス入力比較は最後にスペースが詰められます。これは、もしそのインデックスが固有の値を要求するなら、末尾のスペースだけが異なる値に対して重複キーエラーが発生するということを意味します。たとえば、テーブルに
'a'
が含まれている場合、'a '
を格納しようとすると、重複キーエラーが発生します。これは
BLOB
カラムには当てはまりません。
あらゆる点で、BLOB
カラムを、好きな長さに設定できる
VARBINARY
カラムだと考えることができます。同じように、TEXT
カラムを
VARCHAR
カラムと考えることができます。BLOB
と TEXT
は、次の点で
VARBINARY
と
VARCHAR
とは異なっています。
BLOB
と
TEXT
カラムのインデックスには、インデックス接頭辞長を指定しなければいけません。CHAR
と VARCHAR
では、接頭辞長は任意です。項4.4.2. 「カラムインデックス」
を参照してください。
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=
オプションを使用します。Server System Variables
を参照してください。
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
値を変更することを許可します。
項4.5.3. 「サーバーパラメータのチューニング」、項3.1. 「mysql — MySQL コマンドラインツール」、項3.4. 「mysqldump — データベースバックアッププログラム」を参照してください。ソート中のパケットサイズとデータオブジェクトのサイズを必要とする記憶容量に基づいて比較したい場合には、項6.5. 「データ型のストレージ要件」
を参照してください。
BLOB
や
TEXT
値はそれぞれ内部的に別々に割り当てられたオブジェクトによって表現されます。これは、テーブルが開かれたときにそれぞれのカラムに容量が一度割り当てられるという形の、その他すべてのデータ型とは異なります。
時には、メディアファイルのようなバイナリデータを
BLOB
や
TEXT
カラムに格納することが望ましい場合もあるでしょう。MySQL
の文字列操作関数がこのようなデータを利用するのに役に立つでしょう。詳しくは項7.4. 「文字列関数」を参照してください。安全とその他の理由のため、これを行うには、アプリケーションユーザーに
FILE
権限の利用を許可するのではなく、アプリケーションコードを利用して行う方が望ましいです。MySQL
フォーラム (http://forums.mysql.com/)
では、さまざまな言語やプラットフォームの詳細について話し合うことができます。