mysql里面的东西都是做什么用的 mysql里float是什么东西

作者&投稿:从放 (若有异议请与网页底部的电邮联系)
MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。但每种列类型都还可细分。
下面对各种列类型进行详细介绍。

数值类的数据列类型
数值型的列类型包括整型和浮点型两大类。

TINYINT:1字节 非常小的正整数,带符号:-128~127,不带符号:0~255
SMALLINT:2字节 小整数,带符号:-32768~32767,不带符号:0~65535
MEDIUMINT:3字节 中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215
INT:4字节 标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295
BIGINT:8字节 大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615
FLOAT:4字节 单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38
DOUBLE:8字节 双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308
DECIMAL:M+2字节 以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。

整型数据列类型

MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。

声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。

浮点型数据列类型

MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。
浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。

MySQL 4.0.2版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。

浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的,默认,当MySQL版本大于3.23.6时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在MySQL3.23.6后可选,默认D值为0,M值为10。

如何选择数值类数据列类型?

为了节省存储空间和提高数据库处理效率,我们应根据应用数据的取值范围来选择一个最适合的数据列类型。如果把一个超出数据列取值范围的数存入该列,则MySQL就会截短该值,如:我们把99999存入SMALLINT(3)数据列里,因为SMALLINT(3)的取值范围是-32768~32767,所以就会被截短成32767存储。显示宽度3不会影响数值的存储。只影响显示。

对于浮点数据列,存入的数值会被该列定义的小数位进行四舍五入。如把一个1.234存入FLOAT(6.1)数据列中,结果是1.2。

DECIMAL与FLOAT和DOUBLE的区别是:DECIMAL类型的值是以字符串的形式被储存起来的,它的小数位数是固定的。它的优点是,不会象FLOAT和DOUBLE类型数据列那样进行四舍五入而产生误差,所以很适合用于财务计算;而它的缺点是:由于它的存储格式不同,CPU不能对它进行直接运算,从而影响运算效率。DECIMAL(M,D)总共要占用M+2个字节。

数值类数据列的属性

ZEROFILL属性适用于所有数值类数据列类型,作用是,如果数值的宽度小于定义的显示宽度,则在数值前填充0。
UNSIGNED属性不允许数据列出现负数。
AUTO_INCREMENT属性可生成独一无二的数字序列。只对整数类的数据列有效。
NULL和NOT NULL属性设置数据列是否可为空。
DEFAULT属性可为数据列指定默认值。

//////////////////////////////////////////////////////

字符串类数据列类型

字符串可以用来表示任何一种值,所以它是最基本的类型之一。
我们可以用字符串类型来存储图象或声音之类的二进制数据,也可存储用gzip压缩的数据。
下表介绍了各种字符串类型:

CHAR[(M)] M字节 M字节
VARCHAR[(M)] M字节 L+1字节
TINYBLOD,TINYTEXT 2^8-1字节 L+1字节
BLOB,TEXT 2^16-1字节 L+2
MEDIUMBLOB,MEDIUMTEXT 2^24-1字节 L+3
LONGBLOB,LONGTEXT 2^32-1字节 L+4
ENUM('value1','value2',...) 65535个成员 1或2字节
SET('value1','value2',...) 64个成员 1,2,3,4或8字节

L+1、L+2是表示数据列是可变长度的,它占用的空间会根据数据行的增减面则改变。数据行的总长度取决于存放在这些数据列里的数据值的长度。L+1或L+2里多出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。

如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。

ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。

字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:

二进制字符串被视为一个连续的字节序列,与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。

非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。

在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服务器的字符集作为默认字符集。

非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式:

二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。

非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。

二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字节字符集,它能容纳的字符个数肯定少于20个。

CHAR和VARCHAR

CHAR和VARCHAR是最常用的两种字符串类型,它们之间的区别是:

CHAR是固定长度的,每个值占用相同的字节,不够的位数MySQL会在它的右边用空格字符补足。

VARCHAR是一种可变长度的类型,每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。

CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是从MySQL4.0.2版开始的。它们的作用是作为占位符或用来表示各种on/off开关值。

如何选择CHAR和VARCHAR,这里给出两个原则:

如果数据都有相同的长度,选用VARCHAR会多占用空间,因为有一位用来存储其长度。如果数据长短不一,选用VARCHAR能节省存储空间。而CHAR不论字符长短都需占用相同的空间,即使是空值也不例外。

如果长度出入不大,而且是使用MyISAM或ISAM类型的表,则用CHAR会比VARCHAR好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。

在一个数据表里,只要有一个数据列的长度是可变的,则所有数据列的长度将是可变的。MySQL会进行自动地转换。一个例外,CHAR长度小于4的不会进行自动转换,因为MySQL会认为这样做没必要,节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR,以减少空间占用量。

BLOB和TEXT

BLOB是二进制字符串,TEXT是非二进制字符串。两者都可存放大容量的信息。

有关BLOB和TEXT索引的建立:

BDB表类型和MySQL3.23.2以上版本的MyISAM表类型允许在BLOB和TEXT数据列上建立索引。

ISAM、HEAP和InnoDB表不支持大对象列的索引。

使用BLOB和TEXT应注意的问题:

由于这两个列类型所存储的数据量大,所以删除和修改操作容易在数据表里产生大量的碎片,需定期运行OPTIMIZE TABLE以减少碎片和提高性能。

如果使用的值非常巨大,就需对服务器进行相应的优化调整,增加max_allowed_packet参数的值。对那些可会用到变些巨大数据的客户程序,也需加大它们的数据包大小。

ENUM和SET

ENUM和SET都是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列表中进行选择。ENUM和SET的主要区别是:

ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。例如:ENUM("N","Y")表示,该数据列的取值要么是"Y",要么就是"N"。

SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。

ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。

ENUM的合法取值列表中的字符串被按声明定义的顺序被编号,从1开始。

SET的编号不是按顺序进行编号的,SET中每一个合法取值都对应着SET值里的一个位。第一个合法取值对应0位,第二个合法取值对应1位,以此类推,如果数值形式的SET值等于0,则说明它是一个空字符串,如果某个合法的取值出现在SET数据列里,与之对应的位就会被置位;如果某个合法的取值没有出现在SET数据列里,与之对应的位就会被清零。正因为SET值与位有这样的对应关系,所以SET数据列的多个合法取值才能同时出现并构成SET值。

字符串类型数据列的字符集属性

在MySQL 4.1以前的版本,字符串数据列的字符集由服务器的字符决定,MySQL 4.1版以后的版本可对每个字符串数据列指定不同的字符串。如果按默认方式设置,可按数据列、数据表、数据库、服务器的顺序关联字符串的字符集,直到找一个明确定义的字符集。

/////////////////////////////////////////////////////////

日期,时间型数据列类型

DATE 1000-01-01~9999-12-31 3字节(MySQL3.23版以前是4字节 ) 0000-00-00
TIME -838:59:59~838:59:59 3字节 00:00:00
DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 8字节 0000-00-00 00:00:00
TIMESTAMP 19700101000000~2037年的某个时刻 4字节 00000000000000
YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1字节 0000

MySQL总是把日期和日期里的年份放在最前面,按年月日的顺序显示。

DATE、TIME、DATATIME数据列类型

DATE、TIME和DATATIME类型分别存放日期值、时间值、日期和时间值的组合。它们的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。

DATATIME里的时间值和TIME值是有区别的,DATATIME里的时间值代表的是几点几分,TIME值代表的是所花费的时间。当向TIME数据列插值时,需用时间的完整写法,如12分30秒要写成“00:12:30”。

TIMESTAMP数据列类型

TIMESTAMP数据列的格式是CCYYMMDDhhmmss,取值范围从19700101000000开始,即1970年1月1号,最大到2037年。它的特点是能把数据行的创建或修改时间记录下来:

如果把一个NULL值插入TIMESTAMP列,这个数据列就将自动取值为当前的日期和时间。

在创建和修改数据行时,如果没有明确对TIMESTAMP数据列进行赋值,则它就会自动取值为当前的日期和时间。如果行中有多个TIMESTAMP列,只有第一个会自动取值。

如果对TIMESTAMP设置一个确定的日期和时间值,则会使TIMESTAMP的自动取值功能失效。

TIMESTAMP默认的列宽是14,可指定列宽,以改变显示效果。但不论你指定的列宽如何,MySQL都是以4字节来存储TIMESTAMP值,也总是以14位精度来计算。

如果需要把创建时间和最近一次修改时间同时记录下来,可以用两个时间戳来记录,一个记录创建时间,一个记录修改时间。不过需记住两件事,一是要把记录修改时间的TIMESTAMP数据列放在最前面,这样才会自动取值;二是创建一条新记录时,要用now()函数来初始化创建时间TIMESTAMP数据列,这样,该TIMESTAMP数据列就不会再变化。

YEAR

YEAR是一种单字节的数据列类型,YEAR(4)的取值范围是1901~2155,YEAR(2)的取值范围是1970~2069,但只显示最后两位数。MySQL能自动把两位数字年份转换成四位数字的年份,如97和14分被转换成1997和2014。转换规则是这样的:

年份值00~69将被转换成2000~2069;

年份值70~99将被转换成1970~1999。

00被转换成0000,而不是2000。因为数值00也就是0,而0值是YEAR的一个合法取值。

《MySQL 深入浅出》说的很详细

楼主真是太牛了!!!!!!!!

下个指南吧!太多了

下载了个MySQL5.0的安装包,出来了这几个东西都是干什么的?应该怎么用这个?SQL语法我知道。求大神指点~

下载个5.0的版本作为过渡吧,先从4.*的版本导入到5.0,应该会有语法上的警告,但是不会报错,会把过时的语法转换掉,然后从5.0的版本中导出来,最后导入到5.1版本,
如果sql文件不大的话,那就直接手工去改吧!

  今天做实验,本来以前都已经做得差不多了的,可突然U盘一下子坏掉,计算机无法识别,驱动重装没用,别人机器上也不能使用,看来是U盘自身出问题了。而更可怕的是,最近忙着整理材料,所以许多最新版本的材料和学习工作方面的资料都在U盘中,并且其中的许多老版本自己机器上早已删掉,怪只怪我太信任这块盘了。没办法,实验得重做,资料可能也得重新写重新找了......
  然后就在做第二个实验结尾后意外地发现了MySQL数据类型中float的一个问题,现在帖出来请大家指点。百度中许多同仁也遇到了这个问题--传说中精典的浮点数精度问题。
  原文如下:
 
一、浮点数的概念及误差问题:
浮点数是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点。但同时也存在误差问题,这就是著名的浮点数精度问题!
浮点数有多种实现方法,计算机中浮点数的实现大都遵从 IEEE754 标准,IEEE754 规定了单精度浮点数和双精度浮点数两种规格,单精度浮点数用4字节(32bit)表示浮点数,格式是:
1位符号位 8位表示指数 23位表示尾数
双精度浮点数8字节(64bit)表示实数,格式是:
1位符号位 11位表示指数 52位表示尾数
同时,IEEE754标准还对尾数的格式做了规范:d.dddddd...,小数点左面只有1位且不能为零,计算机内部是二进制,因此,尾数小数点左面部分总是1。显然,这个1可以省去,以提高尾数的精度。由上可知,单精度浮点数的尾数是用24bit表示的,双精度浮点数的尾数是用53bit表示的,转换成十进制:
2^24 - 1 = 16777215 2^53 - 1 = 9007199254740991
由上可见,IEEE754单精度浮点数的有效数字二进制是24位,按十进制来说,是8位;双精度浮点数的有效数字二进制是53位,按十进制来说,是16 位。显然,如果一个实数的有效数字超过8位,用单精度浮点数来表示的话,就会产生误差!同样,如果一个实数的有效数字超过16位,用双精度浮点数来表示,也会产生误差!对于 1310720000000000000000.66 这个数,有效数字是24位,用单精度或双精度浮点数表示都会产生误差,只是程度不同:
单精度浮点数: 1310720040000000000000.00
双精度浮点数: 1310720000000000000000.00
双精度差了 0.66 ,单精度差了近4万亿!这个结果为什么与翟振兴例子中的差很多呢?原因是翟振兴的测试用表中对字段进行了限制,实际上显示的是mysql溢出后的值,而我这里给出的是计算机中实际的值,如果把测试表字段精度提高到24位或以上,得到的结果就相同了。
以上说明了因长度限制而造成的误差,但这还不是全部!采用IEEE754标准的计算机浮点数,在内部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,也会造成误差,原因是不是所有的数都能转换成有限长度的二进制数。对于翟振兴测试中用到的 131072.32 这个数,其有效数字是8位,按理应该能用单精度浮点数准确表示,为什么会出现偏差呢?看一下这个数据二进制尾数就明白了
10000000000000000001010001......
显然,其尾数超过了24bit,根据舍入规则,尾数只取 100000000000000000010100,结果就造成翟振兴测试中遇到的“奇怪”现象!131072.68 用单精度浮点数表示变成 131072.69 ,原因与此类似。实际上有效数字小于8位的数,浮点数也不一定能精确表示,7.22这个数的尾数就无法用24bit二进制表示,当然在数据库中测试不会有问题(舍入以后还是7.22),但如果参与一些计算,误差积累后,就可能产生较大的偏差。
二、mysql 和 oracle中的数值类型:
翟振兴发现的问题是不是只有 mysql 存在呢?显然不是,只要是符合IEEE754标准的浮点数实现,都存在相同的问题。
mysql中的数值类型(不包括整型):
IEEE754浮点数: float (单精度) , double 或 real (双精度)
定点数: decimal 或 numeric
oracle中的数值类型:
oracle 浮点数 : number (注意不指定精度)
IEEE754浮点数: BINARY_FLOAT (单精度) , BINARY_DOUBLE (双精度)
FLOAT,FLOAT(n) (ansi要求的数据类型)
定点数: number(p,s)
如果在oracle中,用BINARY_FLOAT等来做测试,结果是一样的。
因此,在数据库中,对于涉及货币或其他精度敏感的数据,应使用定点数来存储,对mysql来说是 decimal,对oracle来说就是number(p,s)。双精度浮点数,对于比较大的数据同样存在问题!
三、编程中也存在浮点数问题:
不光数据库中存在浮点数问题,编程中也同样存在,甚至可以说更值得引起注意!
通过上面的介绍,浮点数的误差问题应该比较清楚了。如果在程序中做复杂的浮点数运算,误差还会进一步放大。因此,在程序设计中,如果用到浮点数,一定要意识到可能产生的误差问题。不仅如此,浮点数如果处理不好,还会导致程序BUG!看下面的语句:
if (x != y) { z = 1 / (x -y);}
这个语句看起来没有问题,但如果是浮点数,就可能存在问题!再看下面的语句会输出什么结果:
public class Test {
public static void main(String[] args) throws Exception {
System.out.print("7.22-7.0=" + (7.22f-7.0f));
}
}
我们可能会想当然地认为输出结果应该是 0.22 ,实际结果却是 0.21999979 !
因此,在编程中应尽量避免做浮点数的比较,否则可能会导致一些潜在的问题!
除了这些,还应注意浮点数中的一些特殊值,如 NaN、+0、-0、+无穷、-无穷等,IEEE754虽然对此做了一些约定,但各具体实现、不同的硬件结构,也会有一些差异,如果不注意也会造成错误!
四、总结:
从上面的分析,我们可以得出以下结论:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理。
June,浮点数问题,很容易被忽视,可能具有一定的普遍性,也许应该发给其他技术人员,以免再出现这方面的问题。
-----Original Message-----
From: htang [mailto:htang@corp.netease.com]
Sent: Tuesday, September 26, 2006 6:29 PM
To: 翟振兴
Cc: LisaLan; 关宝军; 韦连友
Subject: RE: RE: mysql中float的问题

这个问题不是一个Bug,而是浮点数本身存在的局限。原因是计算机对浮点数的表示是 M * 2 的 N 次方,其中M是尾数,N是指数,在此转换过程中存在数据损失,因此浮点数(包括double类型)是不能精确表示所有实数的。出现的问题正是由误差和四舍五入造成的。
-----Original Message-----
From: 翟振兴 [mailto:zxzhai@corp.netease.com]
Sent: Tuesday, September 26, 2006 12:17 PM
To: htang
Cc: LisaLan; 关宝军; 韦连友
Subject: Re: RE: mysql中float的问题
Importance: High

老唐,您好!
昨天测试发现,当float数据类型超过131072时候,插入的数据会发现不稳定情况,测试过程如下:
mysql> desc test10;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| floattest | float(12,2) | YES | | NULL | |
| doubletest | double(12,2) | YES | | NULL | |
| dectest | decimal(12,2) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
mysql> insert into test10 values(131071,131071,131071);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
+-----------+------------+-----------+
1 row in set (0.00 sec)
mysql> insert into test10 values(131071.32,131071.32,131071.32);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
+-----------+------------+-----------+
2 rows in set (0.00 sec)
mysql> insert into test10 values(131071.68,131071.68,131071.68);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
+-----------+------------+-----------+
3 rows in set (0.01 sec)
mysql> insert into test10 values(131072,131072,131072);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
+-----------+------------+-----------+
4 rows in set (0.00 sec)
mysql> insert into test10 values(131072.32,131072.32,131072.32);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
+-----------+------------+-----------+
5 rows in set (0.00 sec)
mysql> insert into test10 values(131072.68,131072.68,131072.68);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
| 131072.69 | 131072.68 | 131072.68 |
+-----------+------------+-----------+
6 rows in set (0.00 sec)
mysql> insert into test10 values(131072.66,131072.66,131072.66);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
| 131072.69 | 131072.68 | 131072.68 |
| 131072.66 | 131072.66 | 131072.66 |
+-----------+------------+-----------+
mysql> insert into test10 values(1310720000000000000000.66,1310720000000000000000.66,1310720000000000000000.66);
Query OK, 1 row affected, 3 warnings (0.00 sec)
mysql> select * from test10;
+----------------+---------------+---------------+
| floattest | doubletest | dectest |
+----------------+---------------+---------------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
| 131072.69 | 131072.68 | 131072.68 |
| 131072.66 | 131072.66 | 131072.66 |
| 10000000000.00 | 9999999999.99 | 9999999999.99 |
+----------------+---------------+---------------+

以上测试说明:
当insert的数据范围在+-131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置
建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。

mysql里面的东西都是做什么用的
答:MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服务...

mysql数据库是用来做什么的?
答:mysql是数据库,用来存放网站要用的数据的,比如用户名密码之类的信息。你可能是初学的,这样说吧~数据库就是建表格,然后把一张一张的表格钉在一起,就成了一大堆的数据了。用专业的术语,我们把这么一大堆的表格叫数据库。

mysql具体有什么用
答:MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。由于MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大...

...Documents、MySQL Notifier、MySQL Installer有什么用?
答:(2)“MySQL Documents”类似于帮助文件,保留以备后用,可能要检查一下。(3)“MySQL Installer”等效于软件安装和卸载修复程序。(4)“MySQL Notifier”是启动和停止mysql服务的程序,只能在Windows下使用,可以完成新mysql产品的安装并卸载现有mysql, 产品(以上两种)以及修复原始产品的更新也都使用此...

MYSQL数据库有什么作用?
答:数据库顾名思义 存储数据的仓库,就像你家里的仓库一样。MYsql和那什么MSsql,oracle,access,VFP作用都是一样的,如果你熟悉其中的任意一样 就很容易理解了。。买空间送的 那是让你存储你的网站信息的,当然不用它也行,前提是网站的东西少。具体你可以看看数据库的定义:http://baike.baidu.com/...

...个MySQL5.0的安装包,出来了这几个东西都是干什么的?应该怎么用这个...
答:下载个5.0的版本作为过渡吧,先从4.*的版本导入到5.0,应该会有语法上的警告,但是不会报错,会把过时的语法转换掉,然后从5.0的版本中导出来,最后导入到5.1版本,如果sql文件不大的话,那就直接手工去改吧!

SQL和MYSQL是同一共东西吗?
答:1. sql是结构化查询语言,mysql是一个关系型数据库管理系统,在mysql中操作数据库(增删改查等),就是用的sql;2. SQL server也是一个关系型数据库管理系统用的也是sql,只是SQL server和mysql是不同的公司开发的系统;3. MSsql说的就是SQL server,MS是微软的简写,mssql只是人们喜欢这样叫而已。

请问mysql的support-files放的是些什么东西?
答:support-files/里面存放了很多脚本,其中有个support-files/mysql.server,可以拷贝到/etc/init.d/下面,做开机启动脚本。my.cnf是mysql启动时要读取的配置文件

MYSQL是什么东西?
答:PHP呢是一种程序开发语言,一般来说用在网站上面的比较多一些,网站开发的话顺理成章就要用到数据库了,这里,人们首选就是MYSQL,因为有大牛们测试过,PHP和MYSQL搭配起来运行效率各方面都比较不错,是中小型网站开发的首选,与它俩搭配的还有 APAPHE 和 LINUX,业内人士都把这四个合称为 LAMP。想...

mysql primary key有什么作用?
答:这样的话,这个还活着的小孩,以后不管干什么都干不了,因为查无此人。(如果加了主键,那么这种情况就不会发生)但是如果是一张交易表,那么就不需要主键,一个人因为某种原因分三次买了同样的商品,那么交易表就会记录三次,这时除了交易时间不同以外,其他的内容全部相同,这个就可以没有什么主键,...