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 13, Storage Engines.
          
            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.
            From MySQL 4.1.2 on, specifying the CHARACTER SET
            binary attribute for a character data type causes
            the column to be created as the corresponding binary data
            type: CHAR becomes
            BINARY,
            VARCHAR becomes
            VARBINARY, and
            TEXT becomes
            BLOB. For the
            ENUM and
            SET data types, this does not
            occur; they are created as declared. Suppose that you
            specify a table using this definition:
          
CREATE TABLE t
(
  c1 VARCHAR(10) CHARACTER SET binary,
  c2 TEXT CHARACTER SET binary,
  c3 ENUM('a','b','c') CHARACTER SET binary
);
The resulting table has this definition:
CREATE TABLE t
(
  c1 VARBINARY(10),
  c2 BLOB,
  c3 ENUM('a','b','c') CHARACTER SET binary
);
            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 10.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 13.1.3.3, “Compressed Table Characteristics”.

User Comments
Add your own comment.