MySQL 数据类型(float)的注意事项
摘要:
今天左哥问起一个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.
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 ...
随机推荐
- Python 自带IDLE 如何打开
- python weekday()函数
def weekday(self): """Return the day of the week as an integer, where Monday is 0 and ...
- 20145312《网络对抗》 逆向及Bof基础实践
20145312 <网络对抗> 逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- hdu_2048 错排问题
错排问题本质上就是一个动态规划问题,其状态转移方程为: 记d[n]为n个人错排情况的总数. 那么策略可以描述为:分析第n个人错排的可能情况: 1)前n-1个人满足错排的情况,那么第n个人加入后还要错排 ...
- 嵌入式Linux应用程序开发环境搭建记录
2016年2月 参考资料: OK210软件手册(Linux版).pdf Ubuntu下Qt4.7.1编译环境配置说明.pdf 我阅读了以下内容: OK210软件手册(Linux版).pdf 第七章 O ...
- API设计原则(觉得太合适,转发做记录)
API设计原则 对于云计算系统,系统API实际上处于系统设计的统领地位,正如本文前面所说,K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作,理解掌握 ...
- HDU 2732 Leapin' Lizards(最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意: 给出n行的网格,还有若干只蜥蜴,每只蜥蜴一开始就在一个格子之中,并且给出蜥蜴每次的最大跳跃长度d. ...
- Windows 搭建 Linux kernal0.11 环境
下载:http://www.oldlinux.org/Linux.old/bochs/ 安装bochs 运行 界面:
- 经典线程同步问题(生产者&消费者)--Java实现
生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费. 为使生产者与消费者之间能够并发执行,在两 ...
- Linux命令详解-echo
echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开,并在最后加上换行号. 1.命令格式: file [ -bchikLnNprsvz ] [ -f namefile ] [ -F se ...