mysql 0或1用什么类型_01-mysql中的数据类型

mysql中的列数据类型:

数值型、字符串类型、日期/时间类型3种

几种列类型描述使用了下述惯例:

· M#表示最大显示宽度。最大有效显示宽度是255。

· D#适用于浮点和定点类型,表示小数点后面的位数。最大可能的值是30,但不应大于M-2。

· [] #方括号(‘[’和‘]’)表示可选部分。

1、 数值类型

严格数值类型(INTEGER、SMALLINT、DECIMAL和NUMERIC)

近似数值数据类型(FLOAT、REAL 和DOUBLE PRECISION), 并在此基础上做了扩展

扩展后增加了TINYINT、MEDIUMINT和BIGINT这3种长度不同的整型,并增加了BIT类型,用来存放位数据

几个注意点:

M指示最大显示宽度。最大有效显示宽度是255

如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性!!!!!!!!!!!

SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。

在整数列定义中:SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名。

警告:应当清楚,当使用在整数值(其中一个是UNSIGNED类型)之间使用减号时,结果是无符号

整数类型:

整数类型 字节 取值范围

TINYINT[(M)] [UNSIGNED] [ZEROFILL]1个字节 -128~127(有符号) 0~255(无符号)

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]2个字节 -32768~32767(有符号) 0~65535(无符号)

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]3个字节 -8388608~8388607(有符号) 0~16777215(无符号)

INT[(M)] [UNSIGNED] [ZEROFILL]4个字节 -2147483648~2147483647(有符号) 0~4294967295(无符号) 若不指定宽度M,则默认为int(11),一般配合zerofill,即使用"0" 填充

BIGINT[(M)] [UNSIGNED] [ZEROFILL]8个字节 -9223372036854775808~9223372036854775807(有符号) 0~18446744073709551615(无符号)

如果超出类型范围的操作,会发生"Out of range" 错误提示。为了避免此类问题发生,在选择数据类型时要根据应用的实际情况确定其取值范围

注意:

如果指定zerofill属性,会自动添加unsigned属性,虽然设置了zerofill属性,但使用select查询时填充的0并不会显示出来

如果没有unsigned属性,默认是有符号的,而INT类型,如果如果无unsigned属性,有符号默认长度为int(11), 有unsigned属性,无符号默认长度(10)

如果插入的数字的位数大于M指定的位数,不会对插入的数据有任何影响,还是按照类型的实际精度进行保存,即数值会正确被插入,但是指定的数值最大不能超出该类型的取值范围

整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型(一般从1 开始,每行增加1)

一个表中最多只能有一个AUTO_INCREMENT列,对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL, 并定义为PRIMARY KEY或定义为UNIQUE键

使用方式如下:

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_INCRE~ENT NOT NULL, UNIQUE(ID));

浮点类型:

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] 4个字节 ±1.175494351E-38(有符号) ±3.402823466E+38

M是总位数,D是小数点后的位数。如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位

FLOAT(p) [UNSIGNED] [ZEROFILL] p表示精度(以位数表示),但MySQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。

如果p为从0到24,数据类型变为没有M或D值的FLOAT。

如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列单精度FLOAT数据类型相同。

FLOAT(p)语法与ODBC兼容。

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] 8个字节 ±2.2250738585072014E-308 ±1.7976931348623157E+308

M是总位数,D是小数点后的位数。如果M和D被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位!!!!

DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]

REAL[(M,D)] [UNSIGNED] [ZEROFILL] 为DOUBLE的同义词。除了:如果SQL服务器模式包括REAL_AS_FLOAT选项,REAL是FLOAT的同义词而不是DOUBLE的同义词。

float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示

定点数类型

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] M+2个字节 最大取值范围和DOUBLE相同,给定DECIMAL的有效值范围由M和D确定

M是位数的总数,D是小数点(标度)后面的位数。小数点和(负数)的‘-’符号不包括在M中。

如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。

如果D被省略, 默认是0。如果M被省略, 默认是10。

所有DECIMAL列的基本计算(+,-,*,/)用65位精度完成。

DEC[(M[,D])] [UNSIGNED] [ZEROFILL],

NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL],

FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] DECIMAL的同义词,FIXED同义词适用于与其它服务器的兼容性。

定点数在MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

浮点数和定点数都可以用类型名称后加(M, D)的方式来进行表示,"(M, D)表示该值一共显示M位数字(整数位+小数位),其中D位位于小数点后面,M和D又称为精度和标度。

例如,定义为float(7,4)的一个列可以显示为-999.9999

MySQL保存值时进行四舍五入,因此如果在float(7,4)列内插入999.00009, 近似结果是999.0001

decimal在不指定精度时,默认的整数位为10, 默认的小数位为0

示例:

create table t1 (

id1 float(5,2) default null,

id2 double(5,2) default null,

id3 decimal(5,2) default null

);

mysql root@localhost:test1> desc t1

+-------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+--------------+------+-----+---------+-------+

| id1 | float(5,2) | YES | | | |

| id2 | double(5,2) | YES | | | |

| id3 | decimal(5,2) | YES | | | |

+-------+--------------+------+-----+---------+-------+

mysql root@localhost:test1> insert into t1 values(1.23,1.23,1.23);

mysql root@localhost:test1> select * from t1

+------+------+------+

| id1 | id2 | id3 |

+------+------+------+

| 1.23 | 1.23 | 1.23 |

+------+------+------+

再向id1 和id2 字段中插入数据1.234 , 而id3字段中仍然插入1.23

mysql root@localhost:test1> insert into t1 values(1.234,1.234,1.23);

mysql root@localhost:test1> select * from t1

+------+------+------+

| id1 | id2 | id3 |

+------+------+------+

| 1.23 | 1.23 | 1.23 |

| 1.23 | 1.23 | 1.23 | #发现,id1、id2、id3都插入了表t1,但是id1和id2由于标度的限制,舍去了最后一位,数据变为了1.23

+------+------+------+

同时向id1、id2、id3字段中都插入数据1.234

mysql root@localhost:test1> insert into t1 values(1.234,1.234,1.234);

mysql root@localhost:test1> select * from t1

+------+------+------+

| id1 | id2 | id3 |

+------+------+------+

| 1.23 | 1.23 | 1.23 |

| 1.23 | 1.23 | 1.23 |

| 1.23 | 1.23 | 1.23 | #系统出现了一个Warning , 报告id3被截断

+------+------+------+

将id1、id2、id3字段的精度和标度全部去掉,再次插入数据1.23:

mysql root@localhost:test1> alter table t1 modify id1 float

mysql root@localhost:test1> alter table t1 modify id2 double

mysql root@localhost:test1> alter table t1 modify id3 decimal

mysql root@localhost:test1> desc t1

+-------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------------+------+-----+---------+-------+

| id1 | float | YES | | | |

| id2 | double | YES | | | |

| id3 | decimal(10,0) | YES | | | |

+-------+---------------+------+-----+---------+-------+

mysql root@localhost:test1> insert into t1 values(1.234,1.234,1.234);

mysql root@localhost:test1> select * from t1

+-------+-------+-----+

| id1 | id2 | id3 |

+-------+-------+-----+

| 1.23 | 1.23 | 1 |

| 1.23 | 1.23 | 1 |

| 1.23 | 1.23 | 1 |

| 1.234 | 1.234 | 1 | #可以发现id1、id2字段中可以正常插入数据,而id3字段的小数位被截断

+-------+-------+-----+

可知:

float和double如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错&#

你可能感兴趣的:(mysql,0或1用什么类型)