In some cases, MySQL silently changes column specifications
from those given in a CREATE TABLE or
ALTER TABLE statement. These might be
changes to a data type, to attributes associated with a data
type, or to an index specification.
Possible data type changes are given in the following list.
VARCHAR columns with a length less than
four are changed to CHAR.
If any column in a table has a variable length, the entire
row becomes variable-length as a result. Therefore, if a
table contains any variable-length columns
(VARCHAR, TEXT, or
BLOB), all CHAR
columns longer than three characters are changed to
VARCHAR columns. This does not affect
how you use the columns in any way; in MySQL,
VARCHAR is just a different way to
store characters. MySQL performs this conversion because
it saves space and makes table operations faster. See
Chapter 14, Storage Engines and Table Types.
From MySQL 4.1.0 onward, a CHAR or
VARCHAR column with a length
specification greater than 255 is converted to the
smallest TEXT type that can hold values
of the given length. For example,
VARCHAR(500) is converted to
TEXT, and
VARCHAR(200000) is converted to
MEDIUMTEXT. Similar conversions occur
for BINARY and
VARBINARY, except that they are
converted to a BLOB type.
Note that these conversions result in a change in behavior with regard to treatment of trailing spaces.
For a specification of
DECIMAL(,
if M,D)M is not larger than
D, it is adjusted upward. For
example, DECIMAL(10,10) becomes
DECIMAL(11,10).
Other silent column specification changes include modifications to attribute or index specifications:
TIMESTAMP display sizes are discarded
from MySQL 4.1 on, due to changes made to the
TIMESTAMP data type in that version.
Before MySQL 4.1, TIMESTAMP display
sizes must be even and in the range from 2 to 14. If you
specify a display size of 0 or greater than 14, the size
is coerced to 14. Odd-valued sizes in the range from 1 to
13 are coerced to the next higher even number.
Also note that, in MySQL 4.1 and later,
TIMESTAMP columns are NOT
NULL by default.
Before MySQL 4.1.6, you cannot store a literal
NULL in a TIMESTAMP
column; setting it to NULL sets it to
the current date and time. Because
TIMESTAMP columns behave this way, the
NULL and NOT NULL
attributes do not apply in the normal way and are ignored
if you specify them. DESCRIBE
always
reports that a tbl_nameTIMESTAMP column can be
assigned NULL values.
Columns that are part of a PRIMARY KEY
are made NOT NULL even if not declared
that way.
Starting from MySQL 3.23.51, trailing spaces are
automatically deleted from ENUM and
SET member values when the table is
created.
MySQL maps certain data types used by other SQL database vendors to MySQL types. See Section 11.7, “Using Data Types from Other Database Engines”.
If you include a USING clause to
specify an index type that is not legal for a given
storage engine, but there is another index type available
that the engine can use without affecting query results,
the engine uses the available type.
To see whether MySQL used a data type other than the one you
specified, issue a DESCRIBE or
SHOW CREATE TABLE statement after creating
or altering the table.
Certain other data type changes can occur if you compress a table using myisampack. See Section 14.1.3.3, “Compressed Table Characteristics”.

User Comments
Add your own comment.