MySQL5.1字段类型
官方文档:MySQL 5.1参考手册 :: 11. 列类型
?
MySQL字段类型分为3大类:数值类型、日期和时间类型、字符串类型。
?
一、数值类型
如无特别说明,M 表示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。
定义存储需求数据范围说明无符号有符号BIT[(M)]约(M+7)/8B位字段类型。M表示每个值的位数,范围为从1到64;M默认值为1。TINYINT[(M)] [UNSIGNED] [ZEROFILL]1B0~255-128~127很小的整数。BOOL,BOOLEANTINYINT(1)的同义词。zero值为false;非zero值为true。SMALLINT[(M)] [UNSIGNED] [ZEROFILL]2B0~65535-32768~32767小的整数。MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]3B0~16777215-8388608~8388607中等大小的整数。INT[(M)] [UNSIGNED] [ZEROFILL]4B0~4294967295-2147483648~2147483647普通大小的整数。INTEGER[(M)] [UNSIGNED] [ZEROFILL]INT的同义词。BIGINT[(M)] [UNSIGNED] [ZEROFILL]8B0~18446744073709551615-9223372036854775808~9223372036854775807大整数。FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]4B1.175494351E-38~3.402823466E+38-3.402823466E+38~-1.175494351E-38、0小(单精度)浮点数。M是小数纵位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]8BDOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]DOUBLE的同义词。FLOAT(p) [UNSIGNED] [ZEROFILL]如果0 <= p <= 24为4B,如果25 <= p <= 53为8B浮点数。p表示精度(以位数表示),但MySQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。如果p为从0到24,数据类型变为没有M或D值的FLOAT。如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]变长DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]DECIMAL的同义词。?
二、日期和时间类型
?
定义存储需求
支持的范围“零”值
说明DATETIME8B'1000-01-01 00:00:00' ~ '9999-12-31 23:59:59''0000-00-00 00:00:00'
同时包含日期和时间信息;
允许保存日/月和日是零的日期。
DATE3B'1000-01-01' ~ '9999-12-31''0000-00-00'
仅日期值;
允许保存日/月和日是零的日期。
TIMESTAMP4B不能早于1970或晚于203700000000000000
列类型的属性不固定,取决于MySQL版本和服务器运行的SQL模式。TIME3B'-838:59:59' ~ '838:59:59''00:00:00'
以'HH:MM:SS'格式检索和显示TIME值。
无效TIME值被转换为'00:00:00'。
YEAR1B1901 ~ 21550000
表示年。
单字节类型。
以YYYY格式检索和显示YEAR值。
非法YEAR值被转换为0000。
?
1. 每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。
???如果不想在日期中出现零,可以使用NO_ZERO_IN_DATE SQL模式。
2. 如果试图插入一个不合法的日期,MySQL将给出警告或错误。
3. 可以使用ALLOW_INVALID_DATES SQL模式让MySQL接受某些日期。
4. 允许将'0000-00-00'保存为“伪日期”(如果不使用NO_ZERO_DATE SQL模式),这在某些情况下比使用NULL值更方便(并且数据和索引占用的空间更小)。
?
5. 可以使用任何常见格式指—ATETIME、DATE和TIMESTAMP值:
'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。
'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。
'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有间割符的字符串。
'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串。
YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字。
YYYYMMDD或YYMMDD格式的数字。
无效DATETIME、DATE或者TIMESTAMP值被转换为相应类型的“零”值。
?
6. 可以用各种格式指定TIME值:
'D HH:MM:SS.fraction'格式的字符串。
'HHMMSS'格式的没有间割符的字符串。
HHMMSS格式的数值。
超出TIME范围但合法的值被裁为范围最接近的端点。
?
三、字符串类型:
定义存储需求
长度存储(值)说明CHAR(M)
M个字节,0 <= M <= 255
列长度固定为创建表时声明的长度。
长度可以为从0到255的任何值。
?
当保存CHAR值时,在它们的右边填充空格以达到指定的长度。
声明的长度表示你想要保存的最大字符数。
当检索到CHAR值时,尾部的空格被删除掉。
在存储或检索过程中不进行大小写转换。
VARCHAR(M)
L+1个字节,其中L <= M 且0 <= M <= 65535列中的值为可变长字符串。
长度可以指定为0到65,535之间的值。
值保存时不进行填充,只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
声明的长度表示你想要保存的最大字符数。
BINARY(M)
M个字节,0 <= M <= 255
长度是字节长度。保存BINARY值时,在它们右边填充值以达到指定长度。
存储二进制字符串。
插入值时在右侧添加0x00 on,并且选择时不删除尾部的字节。
比较时所有字节很重要,包括ORDER BY和DISTINCT操作。
VARBINARY(M)
L+1个字节,其中L <= M 且0 <= M <= 255
长度是字节长度。?
存储二进制字符串。
插入时不填充字符,选择时不裁剪字节。
比较时所有字节很重要,包括ORDER BY和DISTINCT操作。
BLOBL+2个字节,其中L < 216
有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
它们只是可容纳值的最大长度不同。
二进制大对象,可以容纳可变数量的数据。没有字符集,并且排序和比较基于列值字节的数值值。TEXTL+2个字节,其中L < 216
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。
这些对应4种BLOB类型,有相同的最大长度和存储需求。
非二进制字符串(字符字符串)。有一个字符集,并且根据字符集的 校对规则对值进行排序和比较。TINYBLOB, TINYTEXT
L+1个字节,其中L < 28
MEDIUMBLOB, MEDIUMTEXT
L+3个字节,其中L < 224
LONGBLOB, LONGTEXT
L+4个字节,其中L < 232
ENUM('value1','value2',...)
1或2个字节,取决于枚举值的个数(最多65,535个值)
是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。枚举最多可以有65,535个元素。
SET('value1','value2',...)
1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员)
是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。最多可以有64个不同的成员。?
其它数据库与MySQL的类型对应关系:
其它数据库类型
MySQL类型
BOOL,
TINYINT
BOOLEAN
TINYINT
CHAR VARYING(M)
VARCHAR(M)
DEC
DECIMAL
FIXED
DECIMAL
FLOAT4
FLOAT
FLOAT8
DOUBLE
INT1
TINYINT
INT2
SMALLINT
INT3
MEDIUMINT
INT4
INT
INT8
BIGINT
LONG VARBINARY
MEDIUMBLOB
LONG VARCHAR
MEDIUMTEXT
LONG
MEDIUMTEXT
MIDDLEINT
MEDIUMINT
NUMERIC
DECIMAL