Precision和Length对MySQL执行结果的影响

原创 2015年11月17日 19:13:03

Precision和Length对MySQL执行结果的影响是什么?
要回答这个问题,首先概念上要把Precision和Length区分开。Precision表示数值的精度,Length表示数值展示的宽度。他们的关系如下:

Length = Function(Precision, Scale, DateType)

数值列有zerofill修饰的情况下,它转化成字符串时,转化结果的Length受Precision影响。举例如下:

mysql> create table t (i int primary key, j int zerofill, k int(2) zerofill);
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t values (1,1,1);
Query OK, 1 row affected (0.02 sec)


mysql> select * from t;
+---+------------+------+
| i | j          | k    |
+---+------------+------+
| 1 | 0000000001 |   01 |
+---+------------+------+
1 row in set (0.01 sec)


mysql> select substr(j, 1,1)  from t;
+----------------+
| substr(j, 1,1) |
+----------------+
| 0              |
+----------------+
1 row in set (0.00 sec)

mysql> select substr(j, 1, 20)  from t;
+------------------+
| substr(j, 1, 20) |
+------------------+
| 0000000001       |
+------------------+
1 row in set (0.00 sec)

OK,很明显,Precision对于MySQL执行结果是有影响的。那么,换个问题,Length对执行结果有影响吗?我认为:没有。不过,如何证明没有呢?穷举法,穷尽MySQL源码即可(^__^)


然后要理解Length是什么

为什么要引入Length呢?看下面一段解释

unsigned long length

The width of the field. This corresponds to the display length, in bytes.

The server determines the length value before it generates the result set, so this is the minimum length required for a data type capable of holding the largest possible value from the result column, without knowing in advance the actual values that will be produced by the query for the result set.

可见,Length是用来帮助客户端在不知道真实数据的情况下准备好缓冲区,将来存放获取到的真实数据。什么场景下需要这么搞呢?执行prepare语句的时候。MySQL bug系统中就有这么一个bug ,由于Length计算错误,导致客户端内存飙升的问题:Prepare模式下,MySQL告诉客户端,c1这一列的length是1.4GB,客户端遵照“指示”分配了1.4G这么大的缓冲区,用于存放将要获取到的数据,于是,悲剧发生。

理解了上面这些内容之后,就能理解MySQL为啥在Length推导这件事上面只是做到“尽力而为”:Length最终用于指导客户端的内存分配,只要确保Length不小于理论值,就不会出大问题。那帮committer估计心里想的是:“哼哼,我能做到尽力而为,已经很够意思了。很多人直接给你一个最大值,你不也屁颠儿地用得不亦乐乎么?”


回到正题上来。Precision和Length对MySQL执行结果的影响是什么?本文给出的答案如下:

  • Length是否对执行结果有影响?没有。
  • Precision是否对执行结果有影响?有。影响过程和zerofill有关,见上例。

附加结论:

  • Precision是否需要推导?不需要。
  • Length推导还要不要?要。
  • Length推导还要不要精确,并和MySQL兼容?不要。
  • Length推导对谁最重要?字符串。
  • Length推导对谁比较重要?Decimal。
  • Length推导对谁最最不重要?Int、Float、Double。
版权声明:本文为博主原创文章,未经博主允许不得转载。微信hustos联系博主。

Decimal中Scale和Precision是什么

Precision (field length)         精度(字段长度) Scale (decimal places)         范围(小数位数) MySQL要求精度大于等于范围:...
  • maray
  • maray
  • 2015年10月16日 16:30
  • 6210

Mysql各种类型字段长度

列类型                                  需要的存储量  TINYINT                               1 字节SMALLINT     ...
  • lubosheng1984
  • lubosheng1984
  • 2011年07月15日 19:05
  • 21311

Hibernate中precision与scale的用法

Oracle使用标准、可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。  NUMBER数据类型可以有两个限定符,如:  column NUMBER ( precision, scal...
  • nszkadrgg
  • nszkadrgg
  • 2013年01月06日 09:50
  • 6085

关于机器学习中Precision和Recall的概念的理解

Andrew Ng 机器学习第六课关于这个Precision和Recall的概念,我一直不能很好的理解,所以我找了个时间梳理的了一下。 - Accuracy = 准确率 预测对的除以总样本书 ...
  • Relocy
  • Relocy
  • 2016年05月19日 15:04
  • 9727

多分类问题中每一类的Precision-Recall Curve曲线以及ROC的Matlab画法

这两天写论文中,本来设计的是要画这个Precision-Recall Curve的,因为PRC是从信息检索中来的,而且我又做的类似一个检索,所以要画这个图,但是我靠,竟然发现不好画,找了很多资料等。最...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月03日 14:22
  • 3737

准确率和召回率(precision&recall)

算法评价指标:准确率和召回率。
  • u010367506
  • u010367506
  • 2014年08月23日 14:26
  • 4301

oracle data_length和data_precision的区别

这两个属性都属于user_tab_columns视图,他们的含义: data_length:当前列数据类型的字节长度 如:EMPNO NUMBER(4) 22 ...
  • BOBO12082119
  • BOBO12082119
  • 2011年04月08日 08:30
  • 4375

Precision, Scale, and Length (Transact-SQL)

Precision is the number of digits in a number. Scale is the number of digits to the right of the dec...
  • tyyurree
  • tyyurree
  • 2012年07月07日 12:48
  • 426

sql语句执行结果对返回值的影响

java程序通过ibatis框架与数据库通信时,dao层代码片段如下: public List branchsSelect(){ List list = null; SqlSession...
  • gchonghavefun
  • gchonghavefun
  • 2012年10月18日 14:38
  • 492

静态库改为动态库后,可以影响到程序的执行结果

源于systemd的例子 先看bus-error.h中的一个宏: #define BUS_ERROR_MAP_ELF_REGISTER ...
  • ayu_ag
  • ayu_ag
  • 2016年06月20日 20:31
  • 588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Precision和Length对MySQL执行结果的影响
举报原因:
原因补充:

(最多只允许输入30个字)