11.4.3. The BLOB
and TEXT
Types
A BLOB
is a binary large object that can hold
a variable amount of data. The four BLOB
types are TINYBLOB
, BLOB
,
MEDIUMBLOB
, and LONGBLOB
.
These differ only in the maximum length of the values they can
hold. The four TEXT
types are
TINYTEXT
, TEXT
,
MEDIUMTEXT
, and LONGTEXT
.
These correspond to the four BLOB
types and
have the same maximum lengths and storage requirements. See
Section 11.5, “Data Type Storage Requirements”. No lettercase conversion
for TEXT
or BLOB
columns
takes place during storage or retrieval.
BLOB
columns are treated as binary strings
(byte strings). TEXT
columns are treated as
non-binary strings (character strings). BLOB
columns have no character set, and sorting and comparison are
based on the numeric values of the bytes in column values.
TEXT
columns have a character set, and values
are sorted and compared based on the collation of the character
set.
If a TEXT
column is indexed, index entry
comparisons are space-padded at the end. This means that, if the
index requires unique values, duplicate-key errors will occur
for values that differ only in the number of trailing spaces.
For example, if a table contains 'a'
, an
attempt to store 'a '
causes a
duplicate-key error. This is not true for
BLOB
columns.
When not running in strict mode, if you assign a value to a
BLOB
or TEXT
column that
exceeds the data type's maximum length, the value is truncated
to fit. If the truncated characters are not spaces, a warning is
generated. You can cause an error to occur and the value to be
rejected rather than to be truncated with a warning by using
strict SQL mode. See Section 5.2.5, “The Server SQL Mode”.
In most respects, you can regard a BLOB
column as a VARBINARY
column that can be as
large as you like. Similarly, you can regard a
TEXT
column as a VARCHAR
column. BLOB
and TEXT
differ from VARBINARY
and
VARCHAR
in the following ways:
For indexes on BLOB
and
TEXT
columns, you must specify an index
prefix length. For CHAR
and
VARCHAR
, a prefix length is optional. See
Section 7.4.3, “Column Indexes”.
BLOB
and TEXT
columns
cannot have DEFAULT
values.
LONG
and LONG VARCHAR
map
to the MEDIUMTEXT
data type. This is a
compatibility feature. If you use the BINARY
attribute with a TEXT
data type, the column
is assigned the binary collation of the column character set.
MySQL Connector/ODBC defines BLOB
values as
LONGVARBINARY
and TEXT
values as LONGVARCHAR
.
Because BLOB
and TEXT
values can be extremely long, you might encounter some
constraints in using them:
-
Only the first max_sort_length
bytes of
the column are used when sorting. The default value of
max_sort_length
is 1024. This value can
be changed using the
--max_sort_length=N
option when starting the mysqld server.
See Section 5.2.2, “Server System Variables”.
You can make more bytes significant in sorting or grouping
by increasing the value of
max_sort_length
at runtime. Any client
can change the value of its session
max_sort_length
variable:
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM t
-> ORDER BY comment;
Another way to use GROUP BY
or
ORDER BY
on a BLOB
or
TEXT
column containing long values when
you want more than max_sort_length
bytes
to be significant is to convert the column value into a
fixed-length object. The standard way to do this is with the
SUBSTRING
function. For example, the
following statement causes 2000 bytes of the
comment
column to be taken into account
for sorting:
mysql> SELECT id, SUBSTRING(comment,1,2000) FROM t
-> ORDER BY SUBSTRING(comment,1,2000);
The maximum size of a BLOB
or
TEXT
object is determined by its type,
but the largest value you actually can transmit between the
client and server is determined by the amount of available
memory and the size of the communications buffers. You can
change the message buffer size by changing the value of the
max_allowed_packet
variable, but you must
do so for both the server and your client program. For
example, both mysql and
mysqldump allow you to change the
client-side max_allowed_packet
value. See
Section 7.5.2, “Tuning Server Parameters”,
Section 8.5, “mysql — The MySQL Command-Line Tool”, and Section 8.10, “mysqldump — A Database Backup Program”.
Each BLOB
or TEXT
value is
represented internally by a separately allocated object. This is
in contrast to all other data types, for which storage is
allocated once per column when the table is opened.
In some cases, it may be desirable to store binary data such as
media files in BLOB
or
TEXT
columns. You may find MySQL's string
handling functions useful for working with such data. See
Section 12.3, “String Functions”. For security and other
reasons, it is usually preferable to do so using application
code rather than allowing application users the
FILE
privilege. You can discuss specifics for
various languages and platforms in the MySQL Forums
(https://forums.mysql.com/).