赞
踩
MySQL 支持所有标准 SQL 中的数值类型,其中包括严格数值类型( INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION),并在此基础上做了扩展。扩展后增加了TINYINT、MEDIUMINT和BIGINT这3种长度不同的整型,并增加了BIT类型,用来存放位数据。下面列出了MySQL 5.0中支持的所有数值类型,其中INT是INTEGER的同名词,DEC是DECIMAL的同名词。
类型 | 字节 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 | (-9,223,372,036,854,775,808, 9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
对于整型数据,MySQL还支持在类型名称后面的小括号内指定显示宽度
比如int(11)和int(8),都是一样的占4字节。tinyint(1)和tinyint(10)也都占用一个字节;后面的11和8表示数据在显示时显示的最小长度;
当字符长度 >= (m)时,正常显示;
当字符长度 < (m)时,就需要指定拿某个字符来填充,比如zerofill(表示用0填充),
例如:设置tinyint(2) zerofill 你插入1时他会显示01;设置tinyint(4) zerofill 你插入1时他会显示0001;
这个M 的表示显示宽度,他跟着zerofill 一起才有意义
如果一个列指定为zerofill,则MySQL自动为该列添加UNSIGNED属性.
建表时,mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。用这些默认的显示长度就可以了。不用再去自己填长度,比如搞个int(10)、tinyint(1)之类的,基本没用。而且导致表的字段类型多样化
create table AI(id int auto_increment not null primary key);
create table AI(id int auto_increment not null ,primary key(id));
create table AI(id int auto_increment not null ,unique(id));
常用tinyint(1)表示布尔型。1表示bool值真,0表示bool值假。
类型 | 字节 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
浮点数类型 | ||||
FLOAT | 4 | (-3.402 823 466 E+38, -1.175 494 351 E-38), 0, (1.175 494 351 E-38, 3.402 823 466 351 E+38) | 0, (1.175 494 351 E-38, 3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 | (-1.797 693 134 862 315 7 E+308, -2.225 073 858 507 201 4 E-308), 0, (2.225 073 858 507 201 4 E-308, 1.797 693 134 862 315 7 E+308) | 0, (2.225 073 858 507 201 4 E-308, 1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
类型 | 字节 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
定点数类型 | ||||
DEC(M,D) DECIMAL(M,D) | max(M,D)+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
对于小数的表示,MySQL 分为两种方式:浮点数和定点数。
浮点数包括 float(单精度)和double(双精度),
而定点数则只有decimal一种表示。
定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
float(m,d)
decimal(m,d)
M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度;
最大长度 <= m,小数位数 <= d,整数位数 <= m-d
1.小数位超过设定值,按四舍五入保存
2.小数位如果都是0,则不保存小数位
float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,定点数如果不写精度和标度,则按照默认值decimal(10,0)来进行操作
格式 | 输入 | 显示 |
---|---|---|
float(5,2) | 1.23 | 1.23 |
double(5,2) | 1.23 | 1.23 |
decimal(5,2) | 1.23 | 1.23 |
float(5,2) | 1.234 | 1.23 |
double(5,2) | 1.234 | 1.23 |
decimal(5,2) | 1.234 | 1.23 |
float | 1.234 | 1.234 |
double | 1.234 | 1.234 |
decimal | 1.234 | 1 |
类型 | 字节 | 默认值 | 范围 | 用途 |
---|---|---|---|---|
位类型 | ||||
BIT(M) | 1~8 | 如果不写则默认为1位 | BIT(1)~BIT(64) |
BIT(位)类型,用于存放位字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写则默认为1位。对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为十六进制格式)函数进行读取。
select bin(id),hex(id) from table;
数据插入 bit 类型字段时,首先转换为二进制,如果位数允许,将成功插入;如果位数小于实际定义的位数,则插入失败,假如插入数字2,因为它的二进制码是“10”,假如id的定义是bit(1),所以将无法进行插入:
类型 | 字节 | 范围 | 格式 | 用途 |
---|---|---|---|---|
TIMESTAMP | 4 | 1970-01-01 00:00:00 / 2038 结束时间是第 2147483647 秒, 北京时间 2038-1-19 11:14:07, 格林尼治时间 2038-1-19 03:14:07 | YYYYMMDD HHMMSS | 插入或更新日期 为当前系统日期 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 表示年月日时分秒 |
DATE | 3 | 1000-01-01 / 9999-12-31 | YYYY-MM-DD | 表示年月日 |
TIME | 3 | ‘-838:59:59’ / ‘838:59:59’ | HH:MM:SS | 表示时分秒 |
YEAR | 1 | 1901 / 2155 | YYYY | 表示年份 |
每种日期时间类型都有一个有效值范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。不同日期类型零值即格式不变值全为0;
类型 | 字节 | 描述 | 存储要求 | 用途 | |
---|---|---|---|---|---|
CHAR(M) 字符字符串 | M | M 为 0-255 间整数 M 代表字符的个数 | 定长字符串 | 速度快,但浪费空间 | |
长度的限制是0-255个字符。与编码无关,即没有出字节的限制数 | |||||
VARCHAR(M) 字节字符串 | M 为 0-65535 间整数 M 代表字符的个数 | varchar 是变长的,需要利用存储空间保存 varchar 的长度,如果数据小于255个字节,则采用一个字节来保存长度,反之需要两个字节来保存。 | 变长字符串 | 速度慢,但节省空间 | |
与编码有关 一条有效记录最大不能超过65535个字节。 utf8 最大为21844个字符 gbk 最大为32766个字符 latin1 最大为65532个字符 | varchar 最大有效长度是65532字节,因为在varchar存字符串时,第一个字节是空的,不存在任何数据,然后还需两个字节来存放字符串的长度,所以有效长度是65535-1-2=65532字节。 例:若一个表定义为 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 问N的最大值是多少? 答:(65535-1-2-4-30*3)/3 | ||||
BINARY(M) | M | 允许长度0-M bytes的定长字节字符串 | 定长二进制字符串 | ||
VARBINARY(M) | 允许长度0-M bytes的变长字节字符串 | 值的长度+1byte | 变长二进制字符串 | ||
TINYBLOB | 允许长度长度0-255 bytes | 值的长度+1byte | 不超过255个字符的二进制字符串 | ||
BLOB | 允许长度0-65 535 bytes | 值的长度+2bytes | 二进制形式的长文本数据 | ||
MEDIUMBLOB | 允许长度0-16 777 215 bytes | 值的长度+3bytes | 二进制形式的中等长度文本数据 | ||
LONGBLOB | 允许长度0-4 294 967 295 bytes | 值的长度+4bytes | 二进制形式的极大文本数据 | ||
TINYTEXT | 允许长度0-255 bytes | 值的长度+2bytes | 短文本字符串 | ||
TEXT | 允许长度0-65 535 bytes | 值的长度+2bytes | 长文本数据 | text 在定义时,不需要定义长度,也不会计算总长度。 text 类型在定义时,不可给default值 | |
MEDIUMTEXT | 允许长度0-16 777 215 bytes | 值的长度+3bytes | 中等长度文本数据 | ||
LONGTEXT | 允许长度0-4 294 967 295 bytes | 值的长度+4bytes | 极大文本数据 |
ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定;
create table t (gender enum('M','F'));
INSERT INTO t VALUES('M'),('1'),('f'),(NULL);
select * from t;
M M F NULL
SET和ENUM类型非常类似,也是一个字符串对象,里面可以包含0~64个成员。
Create table t (col set('a','b','c','d');
insert into t values('a,b'),('a,d,a'),('a,b'),('a,c'),('a');
select * from t;
| a,b |
| a,d |
| a,b |
| a,c |
| a |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。