[转]MySQL 数据类型(float)的注意事项
http://www.cnblogs.com/zhoujinyi/archive/2013/04/26/3043160.html
可能由于版本关系,我的mysql5.7插入数据超过范围时会提示,1264 - Out of range value for column 'price' at row 1
摘要:
今天左哥问起一个float浮点数类型的问题,这个类型用的不多,所以也不太了解,现在打算测试下。
知识点:
float:浮点数,单精度,占4字节。
测试

root@localhost : test 05:49:32>create table fl(id int,fl float);
Query OK, 0 rows affected (0.05 sec) root@localhost : test 05:49:40>insert into fl values(1,123456);
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:49:51>insert into fl values(2,123.456);
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:49:57>insert into fl values(3,1234.567);#7位了
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:50:13>insert into fl values(4,1234567);#7位了
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:50:26>select * from fl;
+------+-------------+
| id | fl |
+------+-------------+
| 1 | 123456 |
| 2 | 123.456 |
| 3 | 1234.57 |
| 4 | 1.23457e+06 |
+------+-------------+
4 rows in set (0.00 sec)

从上面看出:默认的float类型都只能存6个数字(包括小数点前后的位数),整数超过6位就被科学计数表示(id=4),小数位超出则需要四舍五入。那指定float(m)的精度呢?

root@localhost : test 05:59:08>create table fl(id int,fl float(20));
Query OK, 0 rows affected (0.04 sec) root@localhost : test 05:59:28>show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec) root@localhost : test 05:59:35>insert into fl values(1,123456);
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:59:44>insert into fl values(2,123.456);
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:59:46>insert into fl values(3,1234.567);#7位了
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:59:50>insert into fl values(4,1234567);#7位了
Query OK, 1 row affected (0.00 sec) root@localhost : test 05:59:53>select * from fl;
+------+-------------+
| id | fl |
+------+-------------+
| 1 | 123456 |
| 2 | 123.456 |
| 3 | 1234.57 |
| 4 | 1.23457e+06 |
+------+-------------+
4 rows in set (0.01 sec)

从上面看出:和默认的float一样。所以:默认float和float(m)一样 ,m<=24; 都是默认float类型,都只能存6个数字(包括小数点前后的位数),整数超过6位就被科学计数表示(id=4);小数位超出则需要四舍五入。那指定他的标度float(m,d) 呢?

mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(7,4) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.02 sec) ERROR:
No query specified mysql> insert into fl values(1,123456);#整数是3位,超出了
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> insert into fl values(3,123.4567);
Query OK, 1 row affected (0.00 sec) mysql> insert into fl values(2,123.45678);#小数位超出,四舍五入
Query OK, 1 row affected (0.00 sec) mysql> insert into fl values(4,12.456789);#小数位超出,四舍五入
Query OK, 1 row affected (0.00 sec) mysql> select * from fl;
+------+----------+
| id | fl |
+------+----------+
| 1 | 999.9999 |
| 3 | 123.4567 |
| 2 | 123.4568 |
| 4 | 12.4568 |
+------+----------+
4 rows in set (0.00 sec)

从上面看出:float(m,d):小数点后位数为d,即整数位数为(m-d),整数位超出则整数为(m-d)个999,小数点后位数为(d)个9999,不用科学计算了;若小数位超出,则需要四舍五入。要是float(m,d)遇到m和d一样呢?

mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(4,4) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.04 sec) mysql> insert into fl values(1,123456);
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> insert into fl values(2,123.45678);
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> insert into fl values(3,123.4567);
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> insert into fl values(4,12.456789);
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from fl;
+------+--------+
| id | fl |
+------+--------+
| 1 | 0.9999 |
| 2 | 0.9999 |
| 3 | 0.9999 |
| 4 | 0.9999 |
+------+--------+
4 rows in set (0.00 sec)

从上面看出:float(m,d):若m和d一样,则先把小数位数先满足了,再分配整数位数。所以只有小数点位数,而整数位是0。
之前提过的m<=24,要是大于24呢?

mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(25) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec) mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` double DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

从上面看出:在没有标度的float中,从float转换成了double。而有标度的 float(m,d)当中,m>24呢?

mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(100,3) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec) mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(100,3) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8

从上面看出:从float还是float,没有受到影响。不过设置这么大,在整数会变的不准;小数的位数还是m-d,位数不足用0填充(zerofill)。如下测试:

mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(100,3) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into fl values(5,777777777777777777777777777.5555);
Query OK, 1 row affected (0.00 sec) mysql> select * from fl;
+------+---------------------------------+
| id | fl |
+------+---------------------------------+
| 5 | 777777744225350500000000000.000 | #不准了
+------+---------------------------------+
1 row in set (0.00 sec)
mysql> drop table fl;
Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(25,23) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec) mysql> show create table fl\G;
*************************** 1. row ***************************
Table: fl
Create Table: CREATE TABLE `fl` (
`id` int(11) DEFAULT NULL,
`fl` float(25,23) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec) mysql> insert into fl values(5,99.555555555555555);
Query OK, 1 row affected (0.00 sec) mysql> select * from fl;
+------+----------------------------+
| id | fl |
+------+----------------------------+
| 5 | 99.55555725097656000000000 | #小数位被0填充
+------+----------------------------+
1 row in set (0.00 sec)

注意:当float(m,d) 设置了标度之后,小数位一定会存在。当整数位没有被超过,需要用0填充;整数位被超过了,需要用9填充,小数位数不能大于30否则报错:

mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(5,3) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8
-> ;
Query OK, 0 rows affected (0.03 sec) mysql> insert into fl values(1,123);
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from fl;
+------+--------+
| id | fl |
+------+--------+
| 1 | 99.999 |
+------+--------+
1 row in set (0.00 sec) mysql> insert into fl values(2,13);
Query OK, 1 row affected (0.00 sec) mysql> insert into fl values(3,3);
Query OK, 1 row affected (0.00 sec) mysql> select * from fl;
+------+--------+
| id | fl |
+------+--------+
| 1 | 99.999 | #9填充
| 2 | 13.000 | #0填充
| 3 | 3.000 |
+------+--------+
3 rows in set (0.00 sec)


mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(102,100) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ERROR 1425 (42000): Too big scale 100 specified for column 'fl'. Maximum is 30. #标度不能大于30,等于30可以建立
mysql> CREATE TABLE `fl` (
-> `id` int(11) DEFAULT NULL,
-> `fl` float(52,50) DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ERROR 1425 (42000): Too big scale 50 specified for column 'fl'. Maximum is 30.

总结:float存在这么多潜在因素,用的时候需要注意,能避免就避免用。
[转]MySQL 数据类型(float)的注意事项的更多相关文章
- MySQL数据类型:UNSIGNED注意事项(转)
原文地址:https://www.cnblogs.com/blankqdb/archive/2012/11/03/blank_qdb.html 1. UNSIGNED UNSIGNED属性就是将数字类 ...
- mysql中float、double、decimal三种类型,以及数值产生误差的原因
单精度浮点数用4字节(32bit)表示浮点数,采用IEEE754标准的计算机浮点数,在内部是用二进制表示的,如:7.22用32位二进制是表示不下的,所以就导致不精确了,存取会出现误差. mysql中f ...
- mysql下float类型使用一些误差详解
单精度浮点数用4字节(32bit)表示浮点数采用IEEE754标准的计算机浮点数,在内部是用二进制表示的如:7.22用32位二进制是表示不下的.所以就不精确了. mysql中float数据类型的问题总 ...
- mysql 创建表时注意事项
mysql 创建表时注意事项 mysql 想必大家都不会陌生吧 是我学习中第一个接触的的数据库 已学习就很快上手的 这是一个关系型数据库 不懂什么是关系型数据库 啊哈哈哈 现在知道啦 因 ...
- mysql索引设计的注意事项
mysql索引设计的注意事项 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过key_len确定究竟使用 ...
- Database基础(一):构建MySQL服务器、 数据库基本管理 、MySQL 数据类型、表结构的调整
一.构建MySQL服务器 目标: 本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器: 安装MySQL-server.MySQl-client软件包 修改数据库用户root的密码 确认 ...
- mysql索引设计的注意事项(大量示例,收藏再看)
mysql索引设计的注意事项(大量示例,收藏再看) 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过ke ...
- mysql数据类型
一.数值类型 Mysql支持所有标准SQL中的数值类型,其中包括严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC),以及近似数值数据类型(FLOAT,REAL,DOUB ...
- mysql 数据类型
1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) ...
- MySQL 数据类型 详解
MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...
随机推荐
- 查看局域网中连接的主机名和对应的IP地址
1.查看局域网中的所有主机名 2.通过主机名解析IP地址:-4选项 3.通过IP地址解析主机名:-a选项
- WM_COMMAND消息
原文地址:https://blog.csdn.net/whm243149796/article/details/78966065 当用户点击菜单.按钮.下拉列表框等控件时候,会触发WM_COMMAND ...
- codeforces411div.2
每日CF: 411div2 Solved A CodeForces 805A Fake NP Solved B CodeForces 805B 3-palindrome Solved C CodeFo ...
- [转] Git + LaTeX workflow
本文取自 https://stackoverflow.com/questions/6188780/git-latex-workflow 感谢 abcd@stackoverflow Changes to ...
- (二)远程代理Remoting/RealProxy
使用.Net Remoting/RealProxy 采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - Real ...
- nodejs,javascript过滤emoj表情
1 前言 由于带emoj表情的昵称无法存储在mysql character_set_server= utf8模式下,按照参考文章[1],改成utf8mb4,无效(可能使用方法不对). 总体思路是,把昵 ...
- Inspector did not run successfully.
装虚拟机,卡在这个报错1天了, server没有问题,其余所有的agent都不能运行. 这部分没有日志,只有单纯的报错信息,omg,百度.bing一顿骚操作,还是没有解决问题. 因为默认安装jdk1. ...
- ionic3 出现莫名广告
应用上线出现 有莫名其妙的广告弹出. 1,DNS被劫持 2,第三方包带广告 3,Http被劫持 wifi和4G网都出现了广告,所以可以直接排除DNS被劫持的问题 广告页只会在H5的页面出现,所以基本可 ...
- react native 打包Ignoring return value of function declared with warn_unused_result attribute
从 github上下载 项目 用于学习查看别人的代码, 当执行完npm install 用xcode 打开 发现俩个错误提示Ignoring return value of function dec ...
- redis-4.0.8 配置文件解读
# Redis configuration file example.## Note that in order to read the configuration file, Redis must ...