在某些情况下,MySQL 会静默更改 CREATE TABLE
或 ALTER TABLE
语句中指定的列规范。这些可能是对数据类型、与数据类型关联的属性或索引规范的更改。
所有更改都受 65,535 字节的内部行大小限制,这可能会导致某些数据类型更改尝试失败。请参见 第 10.4.7 节,“表列计数和行大小的限制”。
作为
PRIMARY KEY
部分的列将被设置为NOT NULL
,即使没有这样声明。MySQL 将其他 SQL 数据库供应商使用的一些数据类型映射到 MySQL 类型。请参见 第 13.9 节,“使用来自其他数据库引擎的数据类型”。
如果您在
USING
子句中指定了对于给定存储引擎不允许的索引类型,但存在另一个索引类型可供引擎使用且不会影响查询结果,则引擎会使用该可用类型。如果未启用严格 SQL 模式,则长度规格大于 65535 的
VARCHAR
列将转换为TEXT
,而长度规格大于 65535 的VARBINARY
列将转换为BLOB
。否则,在这两种情况下都会发生错误。为字符数据类型指定
CHARACTER SET binary
属性会导致该列被创建为相应的二进制数据类型:CHAR
变成BINARY
,VARCHAR
变成VARBINARY
,TEXT
变成BLOB
。对于ENUM
和SET
数据类型,不会发生这种情况;它们将按照声明创建。假设您使用以下定义指定一个表CREATE TABLE t ( c1 VARCHAR(10) CHARACTER SET binary, c2 TEXT CHARACTER SET binary, c3 ENUM('a','b','c') CHARACTER SET binary );
生成的表具有以下定义
CREATE TABLE t ( c1 VARBINARY(10), c2 BLOB, c3 ENUM('a','b','c') CHARACTER SET binary );
要查看 MySQL 是否使用了与您指定的不同的数据类型,请在创建或更改表后发出 DESCRIBE
或 SHOW CREATE TABLE
语句。
如果您使用 myisampack 压缩表,可能会发生某些其他数据类型更改。参见 第 18.2.3.3 节,“压缩表特性”。